0

私はすでにこの種の質問に対する答えをここで検索し、それらをたくさん見つけました-しかし、私はまだ問題の明白な些細なことについてこのしつこい疑問を持っています。

このテーマに関する非常に興味深い有益な記事http://www.joelonsoftware.com/articles/Unicode.htmlを読みましたが、Unicodeデータのバッファーが与えられた場合に個々のグリフを識別する方法について疑問に思いました。

私の質問は次のとおりです。

Unicode文字列(UTF-8など)を解析するにはどうすればよいですか?

バイト順序を知っているとすると、6バイトで表されるはずのグリフの先頭に遭遇するとどうなりますか?

つまり、保存方法を正しく解釈した場合です。

これはすべて、OpenGLで動作するように設計しているテキスト表示システムに関連しています。グリフデータをディスプレイリストに保存していますが、文字列の内容を一連のグリフインデックスに変換し、それをディスプレイリストインデックスにマッピングする必要があります(明らかに、グリフセット全体をグラフィックメモリに保存することは必ずしも実用的ではないためです) )。

すべての文字列をショートパンツの配列として表現する必要があるため、表示する必要があるすべてのものを考慮すると、かなりの量のストレージが必要になります。

さらに、1文字あたり2バイトでは、考えられるすべてのUnicode要素を表すのに十分ではないように思われます。

4

2 に答える 2

2

Unicode文字列(UTF-8など)を解析するにはどうすればよいですか?

「解析」とは、コードポイントに変換することを意味すると思います。

多くの場合、それを行う必要はありません。たとえば、別のUTF-8文字列内でUTF-8文字列を検索できますが、それらのバイトがどの文字を表しているかを気にする必要はありません。

コードポイント(UTF-32)に変換する必要がある場合は、次のようにします。

  1. 最初のバイトをチェックして、文字に含まれるバイト数を確認します。
  2. 文字の末尾のバイトを調べて、80〜BFの範囲にあることを確認します。そうでない場合は、エラーを報告してください。
  3. ビットマスキングとシフトを使用して、バイトをコードポイントに変換します。
  4. 取得したバイトシーケンスが文字を表すために必要な最小値よりも長い場合は、エラーを報告してください。
  5. ポインタをシーケンスの長さだけインクリメントし、次の文字について繰り返します。

さらに、1文字あたり2バイトでは、考えられるすべてのUnicode要素を表すのに十分ではないように思われます。

そうではありません。Unicodeは元々、16ビットエンコーディングで固定することを目的としていました。その後、65,536文字では不十分であると判断されたため、UTF-16が作成され、0〜1,114,111のコードポイントを使用するようにUnicodeが再定義されました。

固定幅のエンコーディングが必要な場合は、21ビットが必要です。ただし、21ビット整数型の言語は多くないため、実際には32ビットが必要です。

于 2010-06-17T07:01:44.283 に答える
0

まあ、私はこれがそれに答えると思います:

http://en.wikipedia.org/wiki/UTF-8

初めて検索したときに表示されなかったのはなぜかわかりません。

于 2010-06-16T18:13:24.457 に答える