2

Basic Multilingual Plane の文字については、'\uxxxx' を使用してエスケープできます。たとえば、/[\u4e00-\u9fff]/ を使用して一般的な漢字に一致させることができます (0x4e00-0x9fff は CJK Unified Ideographs の範囲です)。

ただし、Basic Multilingual Plane 以外の文字の場合、コードは 0xffff よりも大きくなります。'\u20000' は、コードが 0x20000 である文字ではなく、文字 '\u2000' と文字 '0' を意味するため、フォーマット '\uxxxx' を使用してエスケープすることはできません。

Basic Multilingual Plane から文字をエスケープするにはどうすればよいですか? これらの文字はほとんどのフォントで表示できないため、直接使用することはお勧めできません。

4

3 に答える 3

2

BMP の外側の文字は、Javascript によって直接認識されません。内部では UTF-16 サロゲート ペアとして表されます。たとえば、あなたが言及した文字 U+20000 (現在は「CJK Unified Ideographs Ext. B」に割り当てられています) は、サロゲート ペア U+D840 U+DC00 として表されます。Javascript 文字列として、これは単純に"\u2840\uDC00". (1 文字として表示されますが、この文字列は 2 であることに注意してくださいs.length。)

ウィキペディアには、使用されているエンコード方式の詳細があります。

于 2012-11-02T23:48:10.143 に答える
1

興味深い問題です。

ES6ができたので、これを実行できます

let newSpeak = '\u{1F4A9}'

内部的には、サロゲート ペアを含むUTF-16のままであることに注意してください。

newSpeak.length === 2 // "wrong"
[...newSpeak].length === 1
newSpeak === '\uD83D\uDCA9'

ユニコードは巨大です。

また、リテラルだけではありません。

newSpeak.charCodeAt(0) === 0xD83D // "wrong"
newSpeak.codePointAt(0) === 0x1F4A9

String.fromCharCode(0x1F4A9) !== newSpeak
String.fromCodePoint(0x1F4A9) === newSpeak

for (let i = 0; i < newSpeak.length; i++) console.log(newSpeak[i]) // "wrong"
for (let c of newSpeak) console.log(c)

[...''].map(c => `__${c}`).join('') === "____"

私はUnicodeを扱っています。

于 2016-09-17T04:01:49.730 に答える
1

@duskwuff の回答で説明されているように、エスケープされたサロゲート コード ポイントのペアを使用できます。完全な Unicode 入力ユーティリティを使用して表記法を取得するか (ボタン「\u を表示」)、または Fileformat.info文字検索を使用してそれらを見つけることができます (項目「C/C++/Java ソース コード」。JavaScript は同じものを使用するため)。表記はこちら)。

別の方法として、文字を直接入力することもできます。当然、使用するエディターで適切な Unicode サポートが必要です。ただし、JavaScript の実装では、プログラム ソースで非 BMP 文字をサポートする必要はありません。そうかもしれませんし、最近のブラウザの実装は一般的にそうなっています。」(JavaScript と Globalize.js によるグローバル化、p. 177) 文字エンコーディングを適切に宣言するなど、いくつかの注意事項があります。

フォントのサポートは別の問題ですが、文字を操作する場合、少なくともテストでは、いずれにせよある時点で文字を見たいと思うでしょう。したがって、多かれ少なかれ、文字をカバーするフォントが必要です。Fileformat.info ページには、 (U+20000) Font Supportなどのブラウザー サポート情報へのリンクも含まれています。完全ではありませんが、良い出発点です。たとえば、U+20000''は SimSun-ExtB でもサポートされています

于 2012-11-03T06:54:01.570 に答える