3

ハードウェア デバイスに対して Unicode 文字列 (特に英語、ドイツ語、スペイン語、アラビア語) を読み書きする必要があるソフトウェア (c#) に取り組んでいます。ファームウェアの開発者は、自分のコードでは各文字列を固定長のバイト配列として 1 つのバイナリ ファイルに格納することを想定しているため、インデックス (インデックス * 長さ = 開始オフセット) を使用して任意の文字列にすばやくアクセスし、固定長のバイト数を読み取ることができると語っています。 )。.NET が内部的に UTF-16 エンコーディングを使用していることを理解していますが、これは技術的には可変長エンコーディング (Unicode コード ポイントの数によって異なります) であると私は信じています。UTF-16 を使用してエンコードされた場合、英語、ドイツ語、およびスペイン語はすべて 2 バイト/文字を使用することはかなり確信していますが、アラビア語についてはよくわかりません。

まず、UTF-8/UTF-16 エンコーディングの可変長の性質についての私の理解を誰か確認できますか? 次に、多くのスペースを浪費しますが、UTF-32 (固定サイズ、各文字を 4 バイトで表す) は、各文字列を固定長として格納できるようにするための最良のオプションですか? ありがとう!

4

1 に答える 1

2

ユニコード用語:

  • Unicode 文字セットの各エントリはコード ポイントです
  • エンコードされたコード ポイントは、変換形式の 1 つ以上のコード単位で構成されます (UTF-8 は 8 ビットコード単位を使用します。UTF-16 は 16 ビット コード単位を使用します)。
  • ユーザーに表示される書記素は、一連のコード ポイントで構成される場合があります

そう:

  • UTF-8 のコード ポイントは、1、2、3、または 4 オクテット幅です。
  • UTF-16 のコード ポイントは 2 または 4 オクテット幅です。
  • UTF-32 のコード ポイントは 4 オクテット幅です。
  • 画面に表示される書記素の数は、コード ポイントの数よりも少ない場合があります。

したがって、Unicode 範囲全体をサポートしたい場合は、エンコーディングとして選択したこれらの UTF に関係なく、固定長文字列を 32 ビットの倍数にする必要があります (未使用のバイトは 0x0 に設定され、これらは追加され、I/O 中に削除されます。)

ユーザー インターフェイスを介して長さの制限を伝えるという点では、作成できる最も複雑な書記素の幅を見つけようとするよりも、コード ユニットのサイズと一般的な顧客に基づいて妥協点を決定することをお勧めします。

于 2012-12-05T16:36:59.387 に答える