1

これは宿題です。コードだけの議論、進め方に関する高レベルの提案を探しているわけではありません。

私は現在、ファイル内の UTF-16 文字を出力ファイル内の UTF-32 に、またはその逆に変換する課題に取り組んでいます。割り当ては、10 ビット未満の文字のみを含むファイルを処理するための最初のステップとして示されていますが、私は困惑しています。これは私たちの最初の課題であり、C++ を使用したことはありますが、C を実際に使用したことはありません。

私はそのような変換 (S.2.1) に関する RFC を読んでいて、かなりよく理解しているように感じます。UTF-32 文字は、実際にはその構成を定義する 6 ビットが先行する 10 ビットであることを理解しています (110110 は 16 ビットの最初のペアを示し、110111 は「32」の 2 番目のペアを示すと思います)。UTF-16 文字は 6 つの先行 0 で始まりますか?

それとも、UTF-16 文字は 10 ビット未満であり、10 ビット文字にヒットすると、UTF-32 ビット文字に遭遇したことがわかりますか?

私の本当の質問は、8、16などの場合に「10ビット文字」が何を意味するのかということだと思います。しかし、私が言及したことに対する洞察は素晴らしいでしょう!

4

1 に答える 1

1

割り当ては言葉遣いが悪く、誤解を招きます。

Unicode は、最大20 ビット(U+0000 から U+10FFFF)までのコードポイント値を定義します。すべての UTF エンコーディング ( UTF-8UTF-16、およびUTF-32 ) は、異なる方法で 20 ビットすべてをサポートします。

UTF-8 と UTF-16 は可変長エンコーディングです。特定のコードポイントをエンコードするために必要なバイト数は、実際のコードポイント値によって異なります。UTF-8 は、1、2、3、または 4 つの 8 ビット コード単位を使用します。UTF-16 は、1 つまたは 2 つの 16 ビット コードユニットを使用します。

UTF-32 は固定長エンコーディングです。ほとんどのシステムには 20 ビットのデータ型がないため、常に 1 つの 32 ビット コード単位を使用します。

UTF 変換の実装は非常に簡単ですが (変換できるように設計されています)、まずソース ファイルが実際に使用しているエンコーディングを知る必要があります。ファイルが UTF-16 BOMで始まる場合 、それは非常に簡単に検出できます。ただし、BOM が存在しない場合は、ユーザーにエンコーディングを要求するか、データのヒューリスティック分析を使用してエンコーディングを動的に検出する必要があります。

エンコーディングがわかれば、残りは簡単です。

  1. UTF-16 の場合、ファイルを 16 ビット チャンク (一度に 1 コード単位) で読み取り、必要に応じて隣接する UTF-16 サロゲート コード単位を組み合わせます (非常に簡単に検出できます)。完成したシーケンスごとに、エンコードされた 16/20 ビットを抽出し、単一の UTF-32 コード単位で出力します。

  2. UTF-32 の場合、ファイルを 32 ビット チャンク (一度に 1 コード単位) で読み取り、20 ビットを抽出し、必要に応じて 1 または 2 UTF-16 コード単位として出力します。

割り当てで最も難しい部分は、ソース ファイルのエンコーディングを決定することです。

于 2013-09-06T15:56:17.780 に答える