C の文字列が与えられた場合、それが ASCII でエンコードされているか Unicode でエンコードされているかをどのように知ることができますか?
私たちは他に何も知りません。
これは実際には深くて微妙な問題です。簡単に削除できるケースがいくつかあります。残りはそれほど簡単ではありません。
たとえば、文字列がUnicodeバイト順マークで始まる場合、文字列がUnicodeであると想定しても安全な場合があります。ただし、すべてのUnicode文字列がBOMで始まるわけではありません。
文字列のすべてのバイトで8番目のビットがクリアされている場合は、7ビットASCIIであると見なすのが安全な場合があります。trueの場合、もちろん有効なUTF-8でもあります。ただし、めったに見られないが明確に定義されたUTF-7でエンコードすることもできます。この場合、すべてのバイトが7ビットのみを使用することが保証され、通信チャネルでパリティやその他の損傷源の余地が残ります。
文字列(または少なくとも文字列のプレフィックス)をスキャンして、整形式のUTF-8に準拠しているかどうかをテストできます。合格した場合は、UTF-8である可能性があります。もちろん、それは他のエンコーディングである可能性があり、運が良ければ順守するだけです。
UTF-16LEまたはUTF-16BEに準拠しているかどうかのスキャンも同様に可能ですが、同じ注意点があります。
Raymond Chenは、Notepadがファイルをどのように処理するかという観点から、彼のブログでこれについて書いています。
エンコーディングではなく、一連の文字とそのプロパティの標準である「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。もちろん、テキストが非常に短い場合を除き、ヒューリスティックを使用して、どの文字/パターンが可能性が高いかを判断し、意図した意味について非常に合理的な推測を得ることができます。