Unicodeで可能なすべての有効な組み合わせの数を説明付きで求めています。charは1、2、3、または4バイトとしてエンコードできることを知っています。また、その文字の開始バイトで長さがクリアされているのに、継続バイトに制限がある理由もわかりません。
Unicodeで可能なすべての有効な組み合わせの数を説明付きで求めています。charは1、2、3、または4バイトとしてエンコードできることを知っています。また、その文字の開始バイトで長さがクリアされているのに、継続バイトに制限がある理由もわかりません。
回答:
Unicodeで可能なすべての有効な組み合わせの数を説明付きで求めています。
1,111,998:17プレーン×プレーンあたり65,536文字-2048サロゲート-66文字以外
UTF-8およびUTF-32は、理論的には17をはるかに超えるプレーンをエンコードできますが、範囲はUTF-16エンコードの制限に基づいて制限されていることに注意してください。
137,929のコードポイントは、実際にはUnicode12.1で割り当てられています。
また、その文字の開始バイトで長さがクリアされているのに、継続バイトに制限がある理由もわかりません。
UTF-8でのこの制限の目的は、エンコーディングを自己同期化することです。
反例として、中国語のGB18030エンコーディングについて考えてみます。そこでは、文字ß
はバイトシーケンスとして表され81 30 89 38
、数字0
とのエンコーディングが含まれています8
。したがって、このエンコーディング固有の癖のために設計されていない文字列検索関数がある場合、数字8
を検索すると、文字内で誤検知が見つかりますß
。
UTF-8では、これは発生しません。これは、先頭バイトと末尾バイトが重複しないため、長い文字のエンコード内で短い文字のエンコードが発生しないことが保証されるためです。
Unicodeでは、それぞれ65,536文字(または「コードポイント」)の17個のプレーンを使用できます。これにより、合計1,114,112文字が可能になります。現在、このスペースの約10%しか割り当てられていません。
これらのコードポイントがどのようにエンコードされるかについての正確な詳細はエンコードによって異なりますが、あなたの質問はあなたがUTF-8を考えているように聞こえます。継続バイトが制限されている理由は、おそらく次の文字の先頭を簡単に見つけることができるためです(継続文字は常に10xxxxxxの形式ですが、開始バイトがこの形式になることはありません)。
Unicodeは1,114,112のコードポイントをサポートします。2048個の代理コードポイントがあり、1,112,064個のスカラー値を提供します。これらのうち、66個の非文字があり、1,111,998個のエンコードされた文字になります(計算エラーを行わない限り)。
比喩的に正確な答えを与えるために、all of them
。
UTF-8エンコーディングの継続バイトにより、「ラインノイズ」に直面してエンコードされたオクテットストリームの再同期が可能になります。エンコーダーは、次のバイトが新しい文字ポイントの開始であることを知るために、0x80と0xBFの間の値を持たないバイトを前方にスキャンする必要があるだけです。
理論的には、今日使用されているエンコーディングでは、Unicode文字番号が最大31ビットの長さの文字を表現できます。実際には、このエンコードはTwitterなどのサービスに実装されており、最大長のツイートで最大4,340ビット相当のデータをエンコードできます。(140文字[有効および無効]、それぞれ31ビットを掛けます。)
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
64ビットマシンでは35184372088831を出力しますが、32ビットマシンでは整数オーバーフローを引き起こします。perlプログラム内でそのような大きな文字を使用できますが、それらをutf8として出力しようとすると、そのようなものを無効にしない限り、必須の警告が表示されますperl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######
。「looseutf8」と「strictUTF-8」には違いがあります。前者は制限されていません。
len(chr(0x10000))
、2(コード単位)を与えると言うことができます。OS XのカーネルはUTF-8を使用していますが、高レベルのAPI(Cocoaなど)はUTF-16を使用しています。
[𝒜-𝒵]
ください。そうすれば、UTF-16を公開することが失敗であることがわかります。プログラマーに論理文字ではなくエンコード形式で考えさせるのは間違いです。
Unicodeの16進数は110000で、1114112です。
ウィキペディアによると、Unicode 12.1(2019年5月にリリース)には137,994文字が含まれています。