3

ストリームからバイトシーケンスを読み取っています。議論のために、シーケンスが固定長であり、すべてをバイト配列に読み込んだと仮定します(私の場合はそうvector<char>ですが、この質問では重要ではありません)。このバイトシーケンスには文字列が含まれています。文字列はutf-16またはutf-8エンコーディングのいずれかです。残念ながら、それがどれであるかを示す指標はありません。

バイトシーケンスが有効なutf-16エンコーディングを表しているかどうか、またそれが有効なutf-8エンコーディングを表しているかどうかを確認できますが、同じバイトシーケンスが有効なutf-8と有効なutf-16である可能性をイメージすることもできます。同時に。

それで、それはそれがどれであるかを一般的に理解する方法がないことを意味しますか?

4

2 に答える 2

3

コンテンツがラテン文字を使用する言語で書かれていることが予想される場合、null をカウントするだけで UTF-16 が検出されます。UTF-8 では、null バイトは NUL 制御文字にデコードされ、通常はテキストに表示されません。

他のスクリプトで記述された言語は、人為的にそのように構築されない限り、UTF-16 と UTF-8 の両方で完全に有効になることはできません。

したがって、最初にそれ自体が完全に有効な UTF-8 シーケンスであるかどうかを検出します。

  • はいの場合は、null バイトをチェックし、ある場合は UTF-16 です。それ以外は UTF-8 です。
  • そうでない場合は、UTF-16 です。

上記の結果が UTF-16 になった場合、エンディアンも知る必要があるため、それだけでは不十分です。ラテン文字で書かれた言語では、奇数または偶数の null バイトの量がこれを示します。

于 2013-01-07T13:37:05.480 に答える
2
于 2013-01-07T13:05:10.640 に答える