問題タブ [ucs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
122 参照

unicode - UTF-16 文字のバイト幅はどのように決定しますか?

文字が占めるバイト数を決定するために、UTF-16 バイト ストリームを読み取るためのルールは何ですか? 私は標準を読みましたが、実際の UTF-16 でエンコードされたストリームの経験的な観察に基づいて、標準が当てはまらない場所があるようです (または、私が見逃している標準の側面があります)。 .

UTF-16 標準の読み取りからhttps://www.rfc-editor.org/rfc/rfc2781 :

先頭 2 バイトの値 結果の文字長 (バイト)
0x0000-0xC7FF 2
0xD800-0xDBFF 4
0xDC00-0xDFFF 無効なシーケンス (RFC2781 2.2.2)
0xDFFF-0xFFFF 4

実際には、少なくとも一部のケースでは、これが当てはまるようです。アドホック SQL スクリプト (SQL Server 2019; UTF-16 照合順序) を使用しますが、オンライン デコーダーでも検証されます。

キャラクター ユニコード名 ISO10646 UTF-16 エンコード (16 進数、ビッグ エンディアン) サイズ (バイト)
ラテン大文字 A U+0041 00 41 2
Б キリル大文字BE U+0411 04 11 2
ァ</td> カタカナ小文字A U+30A1 30 A1 2
うさぎの顔 U+1F430 D8 3D DC 30 4

ただし、次の ISO 10646 文字を UTF-16 にエンコードすると、4 バイトのように見えますが、先頭の 2 バイトを読み取っても、これほど長いかどうかはわかりません。

キャラクター ユニコード名 UTF-16 エンコード (16 進数、ビッグ エンディアン) サイズ (バイト)
⚕️ アスクレピオスの杖 26 95 FE 0F 4

私は質問をソフトウェアにとらわれないようにしたいと思います。次の SQL は、既定の照合順序と既定の言語を使用して、Microsoft SQL Server 2019 でこの動作を再現します。(SQL Server はリトル エンディアンであることに注意してください)。

簡単に言えば、「このキャラクターの次の単語を読む必要がある」とどのように/なぜ0x2695考えますか? これが公開された UTF-16 標準と一致していないように見えるのはなぜですか?