問題タブ [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.
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 標準と一致していないように見えるのはなぜですか?