Unicodeで何文字をマッピングできますか?


82

Unicodeで可能なすべての有効な組み合わせの数を説明付きで求めています。charは1、2、3、または4バイトとしてエンコードできることを知っています。また、その文字の開始バイトで長さがクリアされているのに、継続バイトに制限がある理由もわかりません。

回答:


118

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では、これは発生しません。これは、先頭バイトと末尾バイトが重複しないため、長い文字のエンコード内で短い文字のエンコードが発生しないことが保証されるためです。


2
あなたがリンクした「自己同期」の記事は、自己同期とは何であるかをまったく説明していません
Pacerier 2012

興味深いことに、UTF8はすべてのUnicode文字をマップするのに4バイトしか必要としませんが、UTF8は、必要に応じて最大680億文字をサポートでき、1文字あたり最大7バイトを使用します。
santiago arizti 2018

10

Unicodeでは、それぞれ65,536文字(または「コードポイント」)の17個のプレーンを使用できます。これにより、合計1,114,112文字が可能になります。現在、このスペースの約10%しか割り当てられていません。

これらのコードポイントがどのようにエンコードされるかについての正確な詳細はエンコードによって異なりますが、あなたの質問はあなたがUTF-8を考えているように聞こえます。継続バイトが制限されている理由は、おそらく次の文字の先頭を簡単に見つけることができるためです(継続文字は常に10xxxxxxの形式ですが、開始バイトがこの形式になることはありません)。


これらの「平面」によると、4バイト文字の最後の3バイトでさえ64個を表現できます。私が間違っている?
ウフクHacıoğulları

はい、それは同期用です。cl.cam.ac.uk
〜mgk25 / ucs /

2
それは時代遅れだと思います。それはもう6つのバイトを使用していません
ウフクHacıoğulları

3
@Andy:それは理にかなっています:UTF-8の元の仕様はより大きな数で機能しました。21ビットの制限は、16ビットの文字に固執していた人々にとってはすごいことでした。したがって、UCS-2はUTF-16として知られる嫌悪感を生みました。
tchrist

1
@Simon:34個の文字以外のコードポイントがあります。ビット単位で0xFFFE == 0xFFFEを追加すると、プレーンごとに2つのそのようなコードポイントがあります。また、0x00_FDD0 ..0x00_FDEFの範囲に31個の文字以外のコードポイントがあります。さらに、UTF-16の欠陥のためにオープンインターチェンジには合法ではないが、プログラム内でサポートされている必要があるサロゲートを差し引く必要があります。
tchrist

5

Unicodeは1,114,112のコードポイントをサポートします。2048個の代理コードポイントがあり、1,112,064個のスカラー値を提供します。これらのうち、66個の非文字があり、1,111,998個のエンコードされた文字になります(計算エラーを行わない限り)。


私の答えを見ていただけますか?なぜ1,112,114のコードポイントがあるのですか?
ウフクHacıoğulları

3
この数は、UTF-16サロゲートシステムを使用してアドレス指定できるプレーンの数に基づいています。1024個の低サロゲートと1024個の高サロゲートがあり、1024²の非BMPコードポイントを提供します。これに65,536のBMPコードポイントを加えると、正確に1,114,112になります。
フィリップ

2
@Philipp、しかしあなたはあなたの答えに「1_112_114」を与えます、しかしあなたはあなたのコメントで「1_114_112」を説明します。おそらく、あなたは2と4混ざっ
ショーンKovacの

1
この答えは何年もの間計算エラーに悩まされてきたので、私は自由にそれをクリーンアップしました。はい、回答の値1112114はタイプミスでした。正しい値は1114112で、これは0x110000の10進値です。
レイトール2018

1

比喩的に正確な答えを与えるために、all of them

UTF-8エンコーディングの継続バイトにより、「ラインノイズ」に直面してエンコードされたオクテットストリームの再同期が可能になります。エンコーダーは、次のバイトが新しい文字ポイントの開始であることを知るために、0x80と0xBFの間の値を持たないバイトを前方にスキャンする必要があるだけです。

理論的には、今日使用されているエンコーディングでは、Unicode文字番号が最大31ビットの長さの文字を表現できます。実際には、このエンコードはTwitterなどのサービスに実装されており、最大長のツイートで最大4,340ビット相当のデータをエンコードできます。(140文字[有効および無効]、それぞれ31ビットを掛けます。)


実際には、理論的には31ビットに制限されておらず、64ビットマシンではさらに大きくすることができます。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」には違いがあります。前者は制限されていません。
tchrist

1
現在使用されているエンコーディングでは、31ビットのスカラー値は使用できません。UTF-32では32ビット値、UTF-8ではさらに多くの値を使用できますが、UTF-16(Windows、OS X、Java、.NET、Pythonで内部的に使用されるため、最も一般的なエンコードスキーム)では、 100万(それでも十分なはずです)。
フィリップ

1
「それらすべて」は正確ではありません。Unicodeにないレガシーエンコーディングの文字があります。たとえば、MacRomanのAppleロゴ、ATASCIIのいくつかのグラフィック文字。OTOH、私用エリアがあるので、これらの文字Unicodeでマッピングできます。それらは標準の一部ではありません。
dan04 2011年

1
@tchrist:Python3はUTF-16を使用します。たとえば、私のシステムではlen(chr(0x10000))、2(コード単位)を与えると言うことができます。OS XのカーネルはUTF-8を使用していますが、高レベルのAPI(Cocoaなど)はUTF-16を使用しています。
フィリップ

1
@Philip:私はPython 2のみを使用していますが、そのUnicodeサポートには多くの要望があります。私はシステム担当者なので、エンドユーザーのクロムメッキは行いません。OSXで使用するすべてのシステムコールはUTF-8を使用します。これは、カーネルがNFCに変換します。Javaでの私のUTF-16の経験はひどいものでした。たとえば、のような非BMPコードポイントをリテラルとして使用して正規表現で括弧で囲まれたcharclassの一致を試してみて[𝒜-𝒵]ください。そうすれば、UTF-16を公開することが失敗であることがわかります。プログラマーに論理文字ではなくエンコード形式で考えさせるのは間違いです。
tchrist 2011年


1

ウィキペディアによると、Unicode 12.1(2019年5月にリリース)には137,994文字が含まれています。


@Ufuk:Unicodeには文字がありません。コードポイントがあります。1文字を構成するために複数のコードポイントが必要になる場合があります。たとえば、文字「5̃」は2つのコードポイントですが、文字「ñ」は1つまたは2つのコードポイント(またはそれ以上!)です。2²¹の可能なコードポイントがありますが、それらのいくつかは非文字または部分文字として予約されています。
tchrist

6
Unicodeは文字エンコード標準です。unicode.org/faq/basic_q.htmlからの最初の回答:「Unicodeはユニバーサル文字エンコードです」、つまり「Unicodeはエンコードではない」と言うのは間違っています。(私はかつて自分でその間違いを犯しました。)
フィリップ

1
@tchrist:Unicode標準では、「抽象文字」や「エンコード文字」など、複数の用語が定義されています。したがって、Unicodeに文字がないと言うことも真実ではありません。
フィリップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.