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) | 日記 | このブログの読者になる | 更新情報をチェックする

2011年05月17日

Lady GagaのJudasって曲がインプリンティングされた件

じゅーだーじゅだー♪
じゅーだーじゅだー♪
じゅーだーじゅだー♪
じゅーだーだーだー♪
がインプリンティングされました。
PVから漂うそこはかとないプッツン成分がまた…。
じゅーだーだーだー♪

Judas [Single, Import, From US] / Lady Gaga (CD...

タグ:音楽
posted by ぺるたご at 23:54| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

JavaScriptのsort

JavaScriptで、配列の中身を並べ替えたいときはsort()を使います。

普通にソート
var array = ["bbb", "dddd", "aa", "c"];
array.sort();
alert(array);


上の例だと「aa」、「bbb」、「c」、「dddd」の順に表示されます。
アルファベット順(文字コードの順)に並べ替えられました。

次はこれを文字数の順に並べ替えます。
実は、sort()は「並べ替えのルール」を引数にとります。

並べ替えルールつきソート1
var array = ["bbb", "dddd", "aa", "c"];
array.sort(function(value1, value2) {
return value1.length - value2.length;
});
alert(array);


これで「c」、「aa」、「bbb」、「dddd」の順に表示されます。
sort()の引数はfunctionで、引数value1とvalue2はそれぞれ配列の要素を表します。
そして戻り値に関しては、
 正の数の場合:value1が先に並び、value2が後に並ぶ
 0の場合:value1とvalue2は同じ順番
 負の数の場合:value1が後に並び、value2が先に並ぶ
となります。

もう一つ、ありがちな例。
人物の年齢が高い順に並べます。

並べ替えルールつきソート2
var array = [
{Name: "ももこ", Age: 8},
{Name: "ひろし", Age: 40},
{Name: "すみれ", Age: 40},
{Name: "さきこ", Age: 11},
{Name: "ともぞう", Age: 76}
];
array.sort(function(value1, value2) {
return value2.Age - value1.Age;
});
for (var i = 0; i < array.length; i++) {
alert(array[i].Name);
}


ともぞう、ひろし、すみれ、さきこ、まるこ、の順に表示されたと思います。
父ひろしと母すみれは逆になってるかもしれません。

ところで父ひろしと母すみれは同い年ですが、順番はどうやって決まるのでしょう?
JavaScriptに限らずソートには安定・不安定という概念があります。
「並べ替えようとしたら順位が同じになってしまった場合、並べ替え前の順位に基づいて並べ替える」
ことを安定といいます。
同様に、
「並べ替えようとしたら順位が同じになってしまった場合、適当に(ソート処理の都合によって)並べ替える」
ことを不安定といいます。

JavaScriptのソートは安定、不安定のどちらなのでしょうか?
これがどうもブラウザによるみたいです。
試してみたところ、IE9とChrome12では安定です。
ソート順が不定だと困る場合は、ソート条件をきっちり指定するしかありません。
先の例だと、
「同い年の場合は名前の五十音順」
とかでしょうか。

タグ:javascript
posted by ぺるたご at 00:38| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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