問題はunescape
(escape
問題になる可能性もありますが、この場合は原因ではありません)。これらの関数はマルチバイトに対応していません。これは何ですかescape
: 入力文字列のバイトを取り、%
先頭に を付けて 16 進表現を返します。unescape
反対を行います。ここで重要な点は、文字ではなくバイトで機能することです。
あなたが欲しいのはencodeURIComponent
/decodeURIComponent
です。両方とも、文字列エンコーディング スキームとして utf-8 を使用します (どこでもフラッシュで使用されるエンコーディング)。これは utf-16 ではないことに注意してください (フラッシュに関する限り、気にする必要はありません)。
encodeURIComponent("д"); //%D0%B4
decodeURIComponent("%D0%B4"); // д
さて、もう少し深く掘り下げたい場合は、ここで何が起こっているかを示します (これは、utf-8 の仕組みに関する基本的な知識があることを前提としています)。
escape("д")
これは戻ります
%D0%B4
なんで?
"д" は flash で utf-8 として扱われます。この文字のコードポイントは 0x0434 です。
バイナリで:
0000 0100 0011 0100
これは 2 つの utf-8 バイトに収まるため、次のようにエンコードされます (ここでe
は、エンコード ビットをp
意味し、ペイロード ビットを意味します)。
1101 0000 1011 0100
eeep pppp eepp pppp
これを 16 進数に変換すると、次のようになります。
0xd0 0xb4
したがって、0xd0,0xb4 は utf-8 でエンコードされた「д」です。
これは に供給されescape
ます。escape
2バイトを見て、あなたに与えます:
%d0%b4
これを に渡しますunescape
。しかしunescape
、少し脳死しているので、常に1バイトが1文字と同じであると考えています。関係する限りunescape
、2 バイトがあるため、2 つの文字があります。0xd0 と 0xb4 のコード ポイントを調べると、次のように表示されます。
0xd0 -> Ð
0xb4 -> ´
そのため、2 つの文字で構成される文字列を返しunescape
ます(実際には utf-8 でエンコードされた 1 つの文字だけを取得した 2 バイトを把握する代わりに)。次に、テキスト プロパティを割り当てると、実際にはд` が渡されません。これがテキスト領域に表示されます。Ð
´
д´ but