2011年05月21日

JavaScriptでunicode文字列をunescapeする

突然ですが、以下のコードで何が表示されるでしょうか?

unicodeを勝手に置き換えてくれる
alert("S\u0026M");


「S&M」と表示されます。
JavaScriptでは\uXXXXという文字列をunicodeと判断して勝手に置き換えてくれます。
これなら特に問題ないのですが、例えばAJAXでJSON形式のデータを取得したときは、
「S\\u0026M」のようなデータが来ることがあります。
「\」が2個です。
これをそのまま表示すると…、

\が2個付いてると…
alert("S\\u0026M");


「S\u0026M」と表示されます。
最初の「\」が2個目の「\」をエスケープして、「u0026」はそのまま表示ってことでしょうか。
もちろん意図したものではありません。
「んだよ!要するに\が1個ならいいんだろ!」ってことで以下のように置換しようとしたら…、

\が1個ならいいんだろ!
alert("S\\u0026M".replace("\\\\", "\\"));


今度は置換に引っかかりません。
内部的に「S\\u0026M」を解釈しようとしたときには既に「\」がエスケープされて1個になってるのでしょう。
ということでunicodeをunescapeする関数を作りましょう。

これが正解
alert(unescapeUnicode("S\\u0026MはRihannaの曲です。"));

function unescapeUnicode(string) {
return string.replace(/\\u([a-fA-F0-9]{4})/g, function(matchedString, group1) {
return String.fromCharCode(parseInt(group1, 16));
});
}


replace()の第2引数にfunctionを与えます。
これが置換のルールというか方法を司ります。
さてこのfunctionの引数ですが、上記の例だと2個しか書いていませんが本当は以下のようになっています。

1:正規表現にマッチした文字列(\\u0026)
2:正規表現の1個目のグループ(0026)
3:正規表現の2個目のグループ

n+1:正規表現のn個目のグループ
n+2:マッチした文字列が何文字目にあるか(1)
n+3:検索した文字列全体(S\\u0026MはRihannaの曲です。)

第2引数から第n+1引数までは、グループ数によって可変長です。
常識的に考えて、可変長の部分は引数リストの最後だろうが!
なんで真ん中に置くんだよ!

replace()以外で特にめぼしいところはありません。
parseInt()で16進の整数に変換し、fromCharCode()でそれを文字に変換します。
タグ:javascript
posted by ぺるたご at 23:08| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/202801583

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。