記事一覧

JavaScript でURLエンコード

JavaScript のメモ。

JavaScript でデータを取得し、PHPに送ってSQLで記録する…というプログラムを作っていました。で、プログラムの都合上、どうしてもJavaScriptでURLエンコードをする必要がありました。

JavaScript には escape() というエンコードを行う関数がありますが、実行してもIEでは通常のURLエンコードを行わないうえにNNでも不完全なURLエンコードを行うため、使用しないことが推奨されています。
encodeURI() なんていう関数もあるようですが、動作するブラウザは少ないようです。

何とかサーバーサイドで処理できないかと色々試したけど、処理の都合上難しい。
うわ、どうしよう。と焦ったけど、あちこち調べた結果、以下のプログラムでURLエンコードができました。
ただ、文字コードはUTF-8になるので、サーバー側で適切な処理をする必要があります。

//URL Encode (UTF-8)
function encodeURL(str) {
  var character = '';
  var unicode   = '';
  var string    = '';
  var i         = 0;

  for (i = 0; i < str.length; i++) {
    character = str.charAt(i);
    unicode   = str.charCodeAt(i);

    if (character == ' ') {
      string += '+';
    } else {
      if (unicode == 0x2a || unicode == 0x2d || unicode == 0x2e || unicode == 0x5f || ((unicode >= 0x30) && (unicode <= 0x39)) || ((unicode >= 0x41) && (unicode <= 0x5a)) || ((unicode >= 0x61) && (unicode <= 0x7a))) {
        string = string + character;
      } else {
        if ((unicode >= 0x0) && (unicode <= 0x7f)) {
          character   = '0' + unicode.toString(16);
          string += '%' + character.substr(character.length - 2);
        } else if (unicode > 0x1fffff) {
          string += '%' + (oxf0 + ((unicode & 0x1c0000) >> 18)).toString(16);
          string += '%' + (0x80 + ((unicode & 0x3f000) >> 12)).toString(16);
          string += '%' + (0x80 + ((unicode & 0xfc0) >> 6)).toString(16);
          string += '%' + (0x80 + (unicode & 0x3f)).toString(16);
        } else if (unicode > 0x7ff) {
          string += '%' + (0xe0 + ((unicode & 0xf000) >> 12)).toString(16);
          string += '%' + (0x80 + ((unicode & 0xfc0) >> 6)).toString(16);
          string += '%' + (0x80 + (unicode & 0x3f)).toString(16);
        } else {
          string += '%' + (0xc0 + ((unicode & 0x7c0) >> 6)).toString(16);
          string += '%' + (0x80 + (unicode & 0x3f)).toString(16);
        }
      }
    }
  }

  return string;
}

実際にURLエンコードを行うときは

text = encodeURL(text);

とします。
うーん、もっと簡単にできる方法があるのだと思っていたけど…。

文字コードなんてキライだー。(T T)

トラックバック一覧

コメント一覧

me 2007年12月25日(火)13時22分 編集・削除

検索したらこちらがヒットしました。コードありがたく使わせていただきます。
ところで、22行目に'ox0f'とありますが、'0x0f'の間違いですよね?
実際コードを読んで確認したのではなく、ふと目に付いただけなんですけど。

ないと 2008年01月29日(火)14時04分 編集・削除

こんにちはー。コメントを見落としていました。m(_ _)m

> 22行目に'ox0f'とありますが、'0x0f'の間違いですよね?

そのようですね。次にこのコードを使うときにテストしてみます…と言いたい所ですが、今はもう素直に encodeURI() を使えば良いと思います。
上のコードはNN4に対応させるために書いたものなので…。(^^;

ではー。

rara 2008年01月31日(木)15時30分 編集・削除

こんにちは。

ソースをみると、大体そのままつかうことだと思いますが、実際にURLエンコードを行うとき、どうすればいいのでしょうか?
この”text = encodeURL(text);”説明を読んでもなかなk理解できません。

宜しくお願いします。

ないと 2008年02月07日(木)11時55分 編集・削除

こんにちはー。

> この”text = encodeURL(text);”説明を読んでもなかなk理解できません。

JavaScriptの基本文法が解らない…ということでしたら、入門書などで調べてみてください~。
何が理解できないのか解らないので…。

ではー。