3

"".charCodeAt(pos)は奇妙な文字のUnicode番号を取得するために使用し、次にString.fromCharCodeその逆を使用します。

しかし、Unicode番号が55349より大きい文字に問題があります。たとえば、黒板太字の文字です。Unicode番号が120169の小文字の黒板太字X( )が必要な場合、JavaScriptからコードにアラートを送信すると、次のようになります。

alert(String.fromCharCode(120169));

私は別のキャラクターを取得します。JavaScript内から直接、Unicode番号が120143の大文字の黒板太字X()をログに記録した場合も、同じことが起こります。

s="";
alert(s.charCodeAt(0))
alert(s.charCodeAt(1))

出力:

55349
56655

このようなキャラクターを操作する方法はありますか?

4

1 に答える 1

7

内部的には、JavaScript は文字列を UCS2 や UTF-16 に似た 16 ビット エンコーディングで格納します。(実際にはこれら2つのどちらでもないので、似ていると言います)。それらが 16 ビットであるという事実は、 65535 を超えるコード ポイントを持つBMPの外側の文字が 2 つの異なる文字に分割されることを意味します。2 つの異なる文字を別々に格納し、後でそれらを再結合すると、問題なく元の文字を取得できるはずです。

ただし、そのような性格を持っていることを認識するのはかなり難しい場合があります.

Mathias Bynens は、これに関するブログ投稿を書いています: JavaScript の内部文字エンコーディング: UCS-2 または UTF-16? . これは非常に興味深いものであり (少し不可解な場合もあります)、UCS-2 から UTF-16 への変換、およびその逆の変換をサポートするコード ライブラリへのいくつかの参照で締めくくられています。その中で必要なものが見つかるかもしれません。

于 2013-01-22T16:08:30.153 に答える