UTF-8は、数百万の新しい文字を持つ広大な外国語の包含をサポートできますか?


86

エイリアンの侵入が発生し、既存のすべてのコンピューターシステムでそれらの言語をサポートすることを余儀なくされた場合、UTF-8は、おそらく大量の文字を許可するように設計されていますか?

(もちろん、エイリアンが実際に言語を持っているかどうか、コミュニケーションをするかどうか、またはその方法はわかりませんが、議論のために想像してください。)

たとえば、言語が数百万の新しい発見されたグリフ、記号、および/または結合文字で構成されている場合、UTF-8は理論的にこれらの新しいグリフを含むように非破壊的な方法で拡張され、既存のすべてのソフトウェアをサポートできますか?

グリフが現在のサイズ制限をはるかに超えており、単一のグリフを表現するためにより多くのバイトを必要とするかどうかにより興味があります。UTF-8を展開できなかった場合、UTF-32に対する単一の利点は単に下位文字のサイズであることを証明していますか?


16
「彼らの言語をサポートしてください」(私の強調)...何個?言語を文字に分解できると確信していますか?たぶん、言語は空間関係に基づいています。-テッド・チェン「あなたの人生の物語」、あなたの人生の物語、その他をご覧ください。せいぜい、これは単純にmax-things-in-X-bytesの質問(トピック外)です。最悪の場合、それは投機的なナンセンスです。(あなたが何を求めているのか明確ではありません)
ロジャースキャント

6
@ScantRoger受け入れられた答えは、意図したとおりに質問に答える上で素晴らしい仕事をします。
Qix

11
受け入れられた答えは、UTF-8、UTF-16、およびUTF-32の事実を私たちに伝える素晴らしい仕事をします。ウィキペディアで簡単に調べることができます。「エイリアンの侵略」については、答えがどのように対処するのかまったくわかりません。
スキャントロジャー

10
関連(スタックオーバーフロー):すべての一般的な言語にUTF-8で十分ですか?
ヤンニス

9
Unicodeは言語をサポートせず、文字をサポートします -グリフは書かれた形式で意味を表すために使用されます。多くの人間の言語にはスクリプトがないため、Unicodeでサポートできません。多くの動物がコミュニケーションすることは言うまでもありませんが、書き言葉はありません。一連のグリフは有限ではないため、ユニコードでは発話イラストや言葉のない漫画によるコミュニケーションをサポートできません。定義上、エイリアンがどのように通信するかはわかりませんので、あなたの質問に答えることは不可能です。ユニコードがサポートできる個別の文字数を知りたい場合は、おそらく明確にする必要があります:)
JacquesB

回答:


109

Unicode標準には多くのスペースがあります。Unicodeコードポイントは、「プレーン」と「ブロック」で構成されています。合計17機のうち、現在未割り当ての機体11機です。各プレーンには65,536文字が格納されているため、現実には外国語用に50万個のコードポイントが用意されています(最初に連絡する前にすべての絵文字を追加しない限り)。Unicode 8.0の時点では、合計で120,737のコードポイントのみが割り当てられており(総容量の約10%)、ほぼ同じ量が割り当てられていませんが、プライベートなアプリケーション固有の使用のために予約されています。合計で、974,530個のコードポイントが割り当てられていません。

UTF-8はUnicodeの特定のエンコーディングであり、現在、コードポイントあたり4オクテット(バイト)に制限されています。これはUTF-16の制限に一致します。特に、UTF-16は17プレーンのみをサポートします。以前は、UTF-8はコードポイントごとに6オクテットをサポートし、32768プレーンをサポートするように設計されていました。原則として、この4バイトの制限は解除できますが、それはUnicodeの現在の組織構造を壊し、UTF-16を段階的に廃止する必要があります。特定のオペレーティングシステムとプログラミングでの定着度を考慮すると、近い将来起こりそうにない言語。

UTF-16がまだ一般的に使用されている唯一の理由は、UTF-16が単一のUnicodeプレーンのみをサポートする欠陥のあるUCS-2エンコーディングの拡張だからです。それ以外の場合は、UTF-8(固定幅ではない)とUTF-32(ASCII互換ではない、共通データ用のスペースの無駄)の両方から望ましくないプロパティを継承し、エンディアンを宣言するためにバイトオーダーマークが必要です。これらの問題にもかかわらず、UTF-16がまだ一般的であることを考えると、私はこれがすぐに自然に変わると楽観的ではありません。願わくば、新しいエイリアンオーバーロードが彼らの支配に対するこの障害を見て、彼らの知恵で地球の表面からUTF-16を追放することを願っています。


7
実際、UTF-8は、UTF-16に一致させるために、4バイトの制限の一部にも制限されています。具体的には、その17/32まで、半分をわずかに超えています。
デュプリケータ

5
Windows以外では、OSまたはOS上のプログラムの大部分がUTF16を使用している他のOSはありません。OSXプログラムは通常UTF8、Androidプログラムは通常UTF8、Linuxは通常UTF8です。したがって、必要なのはWindowsが死ぬことだけです(モバイル分野では既に死んでいます)
slebetman

23
最初の連絡の前にすべての絵文字でいっぱいにしない限り ...そこにあります エイリアンとの平和的な相互作用に対する最も重要な脅威は絵文字です。私たちは運命です。
rickster

13
@slebetmanそうでもない。JVMベースのものはすべてUTF-16を使用します(Androidも、あなたがそうしない理由はわかりません)、JavaScriptはUTF-16を使用します。すぐに。
マルコム

5
@Kaiserludi「ほとんどのLinuxコードはUnicodeにUTF32を使用しています」真剣にどこでそのアイデアを得たのですか?wfopen システムコールなどはありません。すべてUTF8です。地獄のPythonとJava-両方とも歴史的な理由によりUTF-16として文字列を定義します-必要な場合を除き、文字列をUTF-16として保存しません。メモリは高価ですが、CPUは安価です)。Androidについても同じことが言えます。NDKのJStringはUTF8です。これは、主にGoogleのエンジニアが非常識ではないためです。
Voo

30

UTF-8を実際に拡張する場合は、UTF-8が表すことができる絶対最大値を調べる必要があります。UTF-8は次のように構成されています。

Char. number range  |        UTF-8 octet sequence
   (hexadecimal)    |              (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

RFCから恥知らずにコピーされます。)最初のバイトは、現在の文字を構成するフォローアップバイトの数を常に制御することがわかります。

最大8バイトまで拡張できる場合、追加の非Unicode表現を取得します

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111110 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
11111111 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

この手法で可能になる最大の表現を計算する

  10000000₂
+ 00100000₂ * 01000000₂
+ 00010000₂ * 01000000₂^2
+ 00001000₂ * 01000000₂^3
+ 00000100₂ * 01000000₂^4
+ 00000010₂ * 01000000₂^5
+ 00000001₂ * 01000000₂^6
+ 00000001₂ * 01000000₂^7

またはベース10:

  128
+  32 * 64
+  16 * 64^2
+   8 * 64^3
+   4 * 64^4
+   2 * 64^5
+   1 * 64^6
+   1 * 64^7

表現の最大量は4,468,982,745,216になります。

したがって、これらの40億(または1兆)の文字で外国語を表すのに十分であれば、最小限の労力で現在のUTF-8を拡張して新しい外国人の大君を喜ばせることができると確信しています;-)


8
現在、UTF-8は0x10FFFFまでコードポイントのみに制限されていますが、これはUTF-16との互換性のためだけです。拡張する必要がある場合、コードポイントを使用して0x7FFFFFFF(2³¹-1)まで拡張する方法についてあいまいさはありません。しかし、それを超えて、矛盾する定義を見てきました。私が見た定義の1つには111111xx、可能な最初のバイトとして、最大2³²コードポイントの5つの拡張バイトが続きます。ただし、これは、最初の2³¹コードポイントについて言及した定義とのみ互換性があります。
カスペルド

2
はい、WikipediaはUTF-16について何かを言っていますが、実際にはUnicodeまたはISO 10646(コンテキストに依存)を意味します。実際、RFC 3629以降、UTF-8 U + 10FFFFを超えて(またはF4 8F BF BFUTF-8バイトで)未定義です。したがって、ここで私が言及しているのは純粋な憶測です。もちろん、誰かが他の拡張機能について考えることもできます。最初の上位バイトは、それに続く他の構造を意味します(プロセスで自己同期を破壊しないことを願っています)。ただし、実際のUTF-8にできるだけ近くなるようにバイトスキームを完成させようとしました。
ボルデウィン

4
それは4兆ではなく、4兆です。
Ypnypn

1
後続のバイトの数が、最初のバイトの先頭のバイトの数より常に1つ少ないことは、必ずしも必要ではありません。Perlは(2000年以降)UTF-8の内部バリアントを実際にサポートしています。5、6、および7バイトの形式はこの回答と同じですが、FF72ビットを格納できる13バイトのコードユニットを導入しています。2 ^ 36を超えるものは一律に非常に高価ですが、64ビットのintをエンコードしてからいくつかをエンコードできます。
ホッブズ

7

RFC3629は、 UTF-8を1文字あたり最大4バイトに制限し、最大値は0x10FFFFで、最大1,112,064コードポイントを許可します。明らかに、この制限を削除して標準を拡張することもできますが、これは、その制限まで機能する既存のコードに重大な変更を加えることを証明します。

データファイルの観点からは、各バイトの最上位ビット(MSB)が設定されている場合、次のバイトがエンコードの一部であるという基準に基づいて規格が機能するため、これは重大な変更ではありません。RFC3629の前でも、標準は31ビットに制限されていたため、4番目のバイトのMSBは未設定のままでした。

ただし、0x10FFFFを超えて標準を拡張すると、UTF-8とUTF-16との部分的なデータ互換性が損なわれます。


5
理論上、データは後方互換性がありますが、コードは本質的に標準の変更と互換性がありませんか?
Qix

2
@Qix、それは有効なポイントです。既存のUTF-8ファイルは当然、たとえば最大6バイトと互換性があり、さらに数百万のコードポイントを収容できますが、UTF-8を処理するように設計された多くの既存のライブラリはおそらくその拡張子を処理しません。
デビッドアルノ

4
UTF-16は致命的に壊れます。本質的に、最大0x10FFFFまでのコードポイントのみをサポートできます。
gnasher729

1
@ gnasher729:思っているほど大きな問題ではありません。Pre-Unicodeは、これをシフト値(日本語のShift JIS)で解決しました。予約済み/未使用の文字(0xFFFD?)を単に「シフト文字」としてマークし、エンコードをより拡張された形式にシフトします。おそらくUTF32。
Mooingダック

4

実際、文字を結合している場合、無限に多くのグリフを表すUnicodeコードポイントコードは2つだけです。

たとえば、韓国語のハングルアルファベット用にUnicodeがエンコードする2つの方法、Hangul SyllablesHangul Jamoを比較します。の文字Hangul Syllabelssingleは単一のコードポイントでC6C3あるのに対してHangul Jamo、3つのコードポイント110B(ㅇ)116E(ㅜ)11B9(ㅅ)です。明らかに、文字の組み合わせを使用するとコードポイントが大幅に少なくなりますが、各文字を書き込むためにより多くのバイトが必要になるため、書き込みの効率が低下します。

このトリックを使用すると、現在UTF-8またはUTF-16でエンコードできるコードポイントの数を超える必要はありません。

私は彼らの言語がたまたまこの世の言語よりも多くのメッセージごとのバイトを必要とする場合、エイリアンがどれだけ気分を害するかになると思います。たとえば、数百万のキャラクターのそれぞれを1万個のキャラクターを組み合わせて1万個のキャラクターを組み合わせて表現することを気にしないのであれば、問題はありません。一方、地球人よりも多くのバイトを使用することを余儀なくされると、二流の市民のように感じられる場合、いくつかの競合が発生する可能性があります(UTF-8で既に観察されているものとは異なります)。


これは、外国語の文字が実際にはより限られた書記素のセットで構成されている場合のみです。これは当てはまらない可能性があります。
ジャックB

1
私が知っている限り、文字の組み合わせは個々の書記素に関連する必要はありません。Unicode FAQはこれについて沈黙していますが、筆者の印象では、レイアウトエンジンが書記素のシーケンスではないコーミングシーケンスをサポートすることは難しくありません。
オーウェン

これらのエイリアンはどれくらいの期間生きますか、そして彼らが子供時代にグラフェンに分解できないキャラクターを何人学ぶことができますか?また、事前に構成されたハングルは、gzipの後でも、分解されたハングルよりもバイトの優位性を保持しますか?
ダミアンジェリック

-2

編集:質問は今「何百万人もの新しいキャラクター」と言います。これにより、回答が簡単になります。

いいえ。Utf-8はUnicodeエンコードです。Unicodeには1,114,112個の異なるコードポイントを許可するコードスペースがあり、現在割り当てられていないのは100万未満です。そのため、Unicodeで何百万もの新しい文字をサポートすることはできません。定義上、Unicodeエンコードは、Unicodeで定義されているよりも多くの文字をサポートできません。(もちろん、レベルをさらにエンコードすることにより、ごまかすことができます-結局、どんな種類のデータでもたった2文字で表すことができます。)


元の質問に答えるには:

Unicodeは言語自体をサポートしていません。文字(言語を書面で表現するために使用される記号)をサポートしています。

すべての人間の言語に書かれた表現があるわけではないため、すべての人間の言語がUnicodeでサポートされるわけではありません。さらに、多くの動物はコミュニケーションをとりますが、書き言葉はありません。たとえば、クジラには、言語を呼び出すのに十分なほど複雑なコミュニケーション形式がありますが、書かれた形式はありません(また、既存の音声表記ではキャプチャできません)。したがって、地球上のすべての言語でさえUnicodeでサポートできるわけではありません。

さらに悪いのは、ミツバチの言語のようなものです。それは書面で書かれていないだけでなく、書面で有意義に表現することができません。この言語は、基本的には方向を指しますが、太陽の現在の位置に依存する一種のダンスです。したがって、ダンスは、特定の場所と時間でのみ情報価値があります。記号表現またはテキスト表現には、ミツバチの言語では現在表現できない情報(場所、太陽の位置)を含める必要があります。

書面または記号形式のコミュニケーションでさえ、Unicodeで表現できない場合があります。たとえば、グリフのセットは有限ではないため、イラストや言葉のない漫画はUnicodeでサポートできません。空港のような国際的な設定では、多くの絵画的なコミュニケーションに気付くでしょう。そのため、宇宙旅行する外国人のレースが絵画的な言語を使用するように進化したことは考えられません。

外国人種族に、有限の記号セットを持つ書記体系を持つ言語があったとしても、このシステムはユニコードでサポートできないかもしれません。Unicodeは、書き込みがシンボルの線形シーケンスであることを期待しています。音楽表記は、記号の選択と垂直および水平配置の両方で意味がエンコードされるため、Unicodeで完全に表現できない書記法の例です。(Unicodeは個々の音楽記号をサポートしますが、スコアをエンコードすることはできません。)ポリフォニック音楽(珍しいことではない)または同様の複雑さのコミュニケーションチャネルを使用して通信したエイリアンレースは、オーケストラスコアのように見えるライティングシステムを持っている可能性があります。 Unicodeはこれをサポートできません。

しかし、議論のために、すべての言語は、外国語であっても、有限セットから選択された記号の線形シーケンスとして表現できると仮定します。Unicodeはエイリアンの侵入に十分な大きさですか?Unicodeには現在、100万個未満の未割り当てコードポイントがあります。中国語には、最も包括的な中国語辞書によると10万文字が含まれています(現在、それらのすべてが個別の文字としてUnicodeでサポートされているわけではありません)。したがって、中国語の複雑さを持つ10の言語のみがUnicodeをすべて使い果たします。地球上には何百もの異なる書記体系がありますが、幸いなことにほとんどは表意文字ではなくアルファベット順であるため、少数の文字が含まれています。すべての記述言語が中国語のような表意文字を使用している場合、ユニコードは地球に十分な大きささえありません。アルファベットの使用は、限られた数の音素のみを使用する音声に由来しますが、それは人間の生理学に特有です。したがって、たった数十の表意的な書記体系を持つ単一の異星人の惑星でさえ、Unicodeがサポートできるものを超える可能性があります。ここで、このエイリアンがすでに地球の前に他の惑星に侵入しており、サポートする必要のあるキャラクターのセットにそのライティングシステムを含めているかどうかを検討します。

現在のエンコーディングの拡張または変更、または新しいエンコーディングの導入では、Unicodeでサポートされるコードポイントの数に制限があるため、これを解決できません。

したがって、答えはおそらく「いいえ」です。


5
あなたは想像力に欠けています。ダンスの振付家には、舞台俳優が演じるダンスを説明し教えるために使用できる多くの言語と用語があります。ミツバチが何を伝えているかを知るとしたら、それについて書かれた用語を確実に考案することができます。結局のところ、今日の私たちの記述言語のほとんどは音声のエンコードです。エンコーディングの動きは、サウンドのエンコーディングとそれほど違いはありません。
-whatsisname

3
この答えの一部は良いですが、「書かれた形を持たないだけでなく、書かれた形で表現できない」と言うのは、単に間違っています。情報を伝えるものはすべてビットに削減でき、ビットに削減されたものはほとんどどんなキャラクターのストリームにも変換できます。
スティーブンバーナップ

2
@StevenBurnap真ですが、Unicodeは単なるビットシーケンスではありません。これらのビットを解釈する方法であり、かなり厳格です。はい、Unicode文字セットを拡張して、画像からCNC命令まで何でも表すことができますが、これは非常に異なる生き物です。
オーウェン

4
(ほとんどの言語で)ユニコードシンボルが記述するものは、空気圧の変動のパターンであり、ほとんどの言語では、実際にこれらのパターンを実際に一致させるかなりくだらない仕事をしていることに留意してください。
スティーブンバーナップ

3
つまり、「太陽を左に45度45秒飛ばし、次に太陽を右に10度10秒飛ばす」という文は不可能だということですか。確かに、その時点での太陽の位置がコンテキストとして必要です。
スティーブンバーナップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.