encodeURI / decodeURI, encodeURIComponent / decodeURIComponent の正規表現不使用版

RegExp FREE!

encodeURI / decodeURI, encodeURIComponent / decodeURIComponent をサポートしない環境向けにこれらの関数を補うコードを書きました。

既に同様のコードは公開されていますが、本コードは正規表現を使っていないためより広範な環境で利用できます (ノ ̄ω ̄)ノ♪

0.6.x / js / 01_core / 00_builtin.js

万が一ご利用の際は先のリンクから適宜に切り出してください。

気が向いたら自分で切り出して Github にあげるかもしれません。そうそう、テストはいい加減ですので悪しからず。

制作にあたっては公開されている次のコードを参照させていただきました。さらに言いますと、仕様を読んでもサッパリなのでコードをじぃっと眺めてえいやっとやりましたとさ…

Yoshio 氏制作の TransURI.js

かなり早い段階で発表されたヌルコムアーカイブス編纂ひつ長 Yoshio 氏の手になるコードです。NN4 でも動作確認しているそうでザワザワきますね。

残念ながら infoseek は無料ホームページサービスから撤退したため、fucking 三木谷 Web アーカイブスからの引用になります。ありがたいことに Web アーカイブでは現在でもコードが閲覧可能です。

IE5.5 からサポートされた encodeURI() , decodeURI() を他のブラウザで再現

◎ビルトイン関数の decodeURI() よりも高速にデコードされます(IE6.0で確認)

TransURI.js はブラウザが encodeURI 等を備える場合の手当てがありません。

ofk 氏制作の kQuery より~

kQuery を開発されていた ofk 氏によって encodeURI 等がない環境に対してだけ関数が追加されるように変更されたコードが公開されています。

半分ぐらいjQueryからコードを持って来たような気がしますが、IE5でもjQueryっぽく書けるライブラリができていました。正直、あんまりブラウザのチェックとかしていないので、実際に使うのは結構危険です。

正規表現が使える通常の環境では心の中で手を合わせつつこちらを使うとよいでしょう。複雑な正規表現と同様の処理を js でゴリゴリ書いた場合では、経験上、正規表現が圧倒的に高速です。

/*
 * Window
 * by http://nurucom-archives.hp.infoseek.co.jp/digital/trans-uri.html
 */

window.encodeURI || (window.encodeURI = function (x) {
 return ("" + x).replace(/[^!#$&-;=?-Z_a-z~]/g, function (s) {
  var c = s.charCodeAt(0), p = "%";
  return (
   c < 16 ? "%0" + c.toString(16) :
   c < 128 ? p + c.toString(16) :
   c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :
   p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)
  ).toUpperCase();
 });
});

window.encodeURIComponent || (window.encodeURIComponent = function (x) {
 return ("" + x).replace(/[^!'-*.0-9A-Z_a-z~-]/g, function (s) {
  var c = s.charCodeAt(0), p = "%";
  return (
   c < 16 ? "%0" + c.toString(16) :
   c < 128 ? p + c.toString(16) :
   c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :
   p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)
  ).toUpperCase();
 });
});

window.decodeURI || (window.decodeURI = function (x) {
 return ("" + x).replace(/%(E(0%[AB]|[1-CEF]%[89AB]|D%[89])[0-9A-F]|C[2-9A-F]|D[0-9A-F])%[89AB][0-9A-F]|%[0-7][0-9A-F]/ig, function (s) {
  var c = parseInt(s.substring(1), 16);
  return String.fromCharCode(
   c < 128 ? c :
   c < 224 ? (c & 31) << 6 | parseInt(s.substring(4), 16) & 63 :
   ((c & 15) << 6 | parseInt(s.substring(4), 16) & 63) << 6 | parseInt(s.substring(7), 16) & 63
  );
 });
});

// 手抜き
window.decodeURIComponent || (window.decodeURIComponent = window.decodeURI);

謝辞

kQuery は残念ながら開発の停まったプロジェクトですが、その成果は pettanR の js 調教層や DOM 操作層で大変お世話になりました m(__)m

おわりに

いままでは encodeURIComponent / decodeURIComponent を使うときはムズムズと心に引っかかるものがあったけどこれで心置きなく使うことが出来ます ヽ(・∀・)ノ