Read it later.

Web製作に関するサーバ構成やコーディングネタの備忘録として使ってます。

*

[JavaScript]URLエンコードとURLデコード

   

JavaScriptで、URLエンコードとURLデコードを扱う場合、下記のメソッドで実現できる。

// URLエンコード
var encstr = encodeURI("変換したい文字列"); 
// URLデコード
var orgstr = decodeURI("エンコードされた文字列"); 

が、どうやら、JavaScriptの世界では、
文字コードといえば「UTF-8」と相場が決まっているようだ。

と、何が言いたいのかというと、
Shift-JISの文字列を扱うことができない』のである。
Firefoxで実行してみると、下記のエラーメッセージをキャッチすることができる。

URIError: malformed URI sequence

ネットで調べてみると、ライブラリを公開してくれてる御仁が・・・(ありがたや
Escape Codec Library: ecl.js

ecl.js』でぐぐると出てくるのだけど、結構リンク切れが多い。
上記のサイトからVector (Ver.041208)のダウンロードサイトが紹介されているので、そこでダウンロードするといいかも。
主な機能は下記の通り。(上記サイトからの転記です)
結構多彩で便利なので、オススメかも。

  • EscapeSJIS(string)
    stringをShift_JISコードのタイプでescapeエンコードした値を返します。
    iモードの絵文字領域の文字も扱うことができます。
  • UnescapeSJIS(escapedString)
    Shift_JISコードのタイプでescapeエンコードされたescapedStringを元の文字列にデコードした値を返します。
  • EscapeEUCJP(string)
    stringをEUC-JPコードのタイプでescapeエンコードした値を返します。
  • UnescapeEUCJP(escapedString)
    EUC-JPコードのタイプでescapeエンコードされたescapedStringを元の文字列にデコードした値を返します。
  • EscapeJIS7(string)
    stringをJISコードのタイプでescapeエンコードした値を返します。
    半角カタカナも使用可能で、7ビットでエンコードされます。
  • UnescapeJIS7(escapedString)
    JISコードのタイプでescapeエンコードされたescapedStringを元の文字列にデコードした値を返します。
    7ビットでエンコードされた半角カタカナもデコードすることができます。
  • EscapeJIS8(string)
    stringをJISコードのタイプでescapeエンコードした値を返します。
    半角カタカナは、8ビットでエンコードされます。
  • UnescapeJIS8(escapedString)
    JISコードのタイプでescapeエンコードされたescapedStringを元の文字列にデコードした値を返します。
    8ビットでエンコードされた半角カタカナもデコードすることができます。
  • EscapeUnicode(string)
    stringをUnicodeのタイプでescapeエンコードした値を返します。
    IE4.0以上のescape()と互換性があります。
    ◎ライブラリから切り取って単体で使用することも可能です。
  • UnescapeUnicode(escapedString)
    UnicodeのタイプでescapeエンコードされたescapedStringを元の文字列にデコードした値を返します。
    IE4.0以上のunescape()と互換性があります。
    ◎ライブラリから切り取って単体で使用することも可能です。
  • EscapeUTF7(string)
    stringをUTF-7コードのタイプでescapeエンコードした値を返します。
    ◎ライブラリから切り取って単体で使用することも可能です。
  • UnescapeUTF7(escapedString)
    UTF-7コードのescapedStringを元の文字列にデコードした値を返します。
    ◎ライブラリから切り取って単体で使用することも可能です。
  • EscapeUTF8(string)
    stringをUTF-8コードのタイプでescapeエンコードした値を返します。
    IE5.5以上で実装されているencodeURI()またはencodeURIComponent()とは、エンコードする文字の範囲が異なるため、同一の値は得られませんが、同じくIE5.5以上で実装されるdecodeURI(),decodeURIComponent()で問題なくデコードすることができます。
    ◎ライブラリから切り取って単体で使用することも可能です。
    ※encodeURI(),encodeURIComponent()と同等の機能が必要な場合は、TransURI(UTF-8)を使用してください。
  • UnescapeUTF8(escapedString)
    UTF-8コードのタイプでescapeエンコードされたescapedStringを元の文字列にデコードした値を返します。
    IE5.5以上で実装されているdecodeURI(),decodeURIComponent()と互換性があります。
    ◎ライブラリから切り取って単体で使用することも可能です。
    ◎ビルトイン関数のdecodeURI()よりも高速にデコードします(IE6.0で確認)
  • EscapeUTF16LE(string)
    stringをUTF-16LE(リトルエンディアン)コードのタイプでescapeエンコードした値を返します。
    ◎ライブラリから切り取って単体で使用することも可能です。
  • UnescapeUTF16LE(escapedString)
    UTF-16LE(リトルエンディアン)コードのタイプでescapeエンコードされたescapedStringを元の文字列にデコードした値を返します。
    ◎ライブラリから切り取って単体で使用することも可能です。
  • GetEscapeCodeType(escapedString)
    escapeエンコードされたescapedStringを解析し、どのコードのタイプかを判定します。
    ※半角カタカナのみからなる文字列をエンコードしたものや、一部分を抜き出したもの、壊れたものなどは、正確に判定できない場合があります。
    ※UTF-7は判定されません。
    ※コードのタイプがASCIIの場合、”EUCJP”と判定されます。
    ◎ライブラリから切り取って単体で使用することも可能です。
    ◎以下のようにすることで、自動判別機能付きUnescape関数が実現します。

    UnescapeAutoDetect=function(str){
    returnwindow["Unescape"+GetEscapeCodeType(str)](str)
    };
    
  • JCT11280【StringObject】
     JIS規格(JISX0208-1997)に取り込まれている文字に加えて、Windowsで使用できる○付き数字やiモードの絵文字領域の文字(Shift_JISおよびUnicode系のコードで使用可能)なども加えた11280文字(未定義領域も含む)が、JISコード順で代入されています。
     これを生成する関数は、11280文字分のUnicode番号を差分圧縮して、ASCIIコードの文字のみを使って符号化したデータとデコードプログラムからなり、ファイル読み込み時に実行されて、元の文字を生成するようになっています。この仕組みにより、11280文字を記述するのに必要なバイト数の半分近くにまでサイズが縮小され、そして漢字等が直接記述されていないので、任意の文字コードで使用することが可能となります。
     また、
  • JCT8836【StringObject】
    上記のJCT11280の先頭から8836文字までが代入されています。
    EscapeEUCJP(),UnescapeEUCJP(),EscapeJIS7(),UnescapeJIS7(),EscapeJIS8(),UnescapeJIS8()で使用しています。

 - JavaScript

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

  関連記事

firefox
[Firefox Addon] リモートページの取得

非同期の場合はこんな感じ 同期の場合はこんな感じ なお、XPCOM コンポーネン …

firefox
[Firefox Addon] 乱数、シャッフル

どうかなって一瞬思ったけど、なるほど。 Math.random()を使ったサンプ …

javascript
[JavaScipt]lengthプロパティの罠

この時の、sample.lengthって当然「2」が入ってるだろうなって思ったら …