2

C の文字列が与えられた場合、それが ASCII でエンコードされているか Unicode でエンコードされているかをどのように知ることができますか?

私たちは他に何も知りません。

4

2 に答える 2

3

これは実際には深くて微妙な問題です。簡単に削除できるケースがいくつかあります。残りはそれほど簡単ではありません。

たとえば、文字列がUnicodeバイト順マークで始まる場合、文字列がUnicodeであると想定しても安全な場合があります。ただし、すべてのUnicode文字列がBOMで始まるわけではありません。

文字列のすべてのバイトで8番目のビットがクリアされている場合は、7ビットASCIIであると見なすのが安全な場合があります。trueの場合、もちろん有効なUTF-8でもあります。ただし、めったに見られないが明確に定義されたUTF-7でエンコードすることもできます。この場合、すべてのバイトが7ビットのみを使用することが保証され、通信チャネルでパリティやその他の損傷源の余地が残ります。

文字列(または少なくとも文字列のプレフィックス)をスキャンして、整形式のUTF-8に準拠しているかどうかをテストできます。合格した場合は、UTF-8である可能性があります。もちろん、それは他のエンコーディングである可能性があり、運が良ければ順守するだけです。

UTF-16LEまたはUTF-16BEに準拠しているかどうかのスキャンも同様に可能ですが、同じ注意点があります。

Raymond Chenは、Notepadがファイルをどのように処理するかという観点から、彼のブログでこれについて書いています。

于 2012-08-16T01:26:30.207 に答える
0

エンコーディングではなく、一連の文字とそのプロパティの標準である「Unicode」の意味によって異なります。Unicode は、UTF-8、UTF-16、UTF-32 などのいくつかのエンコーディングを指定します。

テキストが ASCII であるか UTF-8 であるかを知りたい場合で、それらが唯一の可能性である場合、答えは常に UTF-8 であり、ASCII である可能性もあります (127 を超えるバイトが含まれていない場合に限ります)。 .

ASCII または UTF-16 の可能性がある場合、127 より大きいバイトが含まれている場合は同様に UTF-16 であると確実に判断できますが、0 から 127 の範囲のバイトのみが含まれている場合は、技術的には ASCII またはUTF-16。もちろん、テキストが非常に短い場合を除き、ヒューリスティックを使用して、どの文字/パターンが可能性が高いかを判断し、意図した意味について非常に合理的な推測を得ることができます。

于 2012-08-16T02:54:07.373 に答える