文字エンコーディング検出、文字セット検出、またはコードページ検出とは、テキストを表す一連のバイトの文字エンコーディングをヒューリスティックに推測するプロセスです。この手法は信頼性が低いと認識されており[ 1 ] 、 HTTP Content-Type:ヘッダーなどの特定のメタデータが利用できない場合、または信頼できないと想定される場合にのみ使用されます。
このアルゴリズムは通常、バイトパターンの統計分析を伴います。[ 2 ]このような統計分析は言語検出にも使用できます。[ 2 ]このプロセスは統計データに依存するため、万能ではありません。[ 1 ]
一般的に、文字セットの検出が間違っていると、文字バイトが実際にはまったく異なるセットに属しているにもかかわらず、誤って検出されたセットに属していると解釈されるため、文字化けが発生します。 [ 3 ] [ 4 ]
文字セット検出が確実に機能する数少ないケースの 1 つは、UTF-8 の検出です。[ 5 ]これは、UTF-8 には無効なバイト シーケンスがかなりの割合で含まれているためです。[注 1 ]そのため、最上位ビットがセットされたバイトを使用する他のエンコーディングのテキストは、UTF-8 の有効性テストに合格する可能性が極めて低くなります。[ 5 ]しかし、不適切に記述された文字セット検出ルーチンは、最初に確実な UTF-8 テストを実行せず、UTF-8 を他のエンコーディングであると判断する可能性があります。たとえば、ドイツの都市ミュンヘンの名前を含む UTF-8 の Web サイトは、コードが UTF-8 かどうかをテストする前に (またはテストせずに) エンコーディングがISO-8859-1またはWindows-1252であると判断するため、 「München」と表示される可能性があります。
UTF-16 は、データを 16 ビットのワードに分割する際に見つかるはずの多数の改行 (U+000A) とスペース (U+0020) と、偶数または奇数の位置にある多数の NUL バイトのおかげで、検出がかなり確実です。一般的な文字をチェックし、テストに頼ってテキストが UTF-16 で有効であることを確認する必要があります。Windowsオペレーティングシステムは、ASCII の「 Bush hid the facts」(改行なし)というフレーズを中国語のUTF-16LEと誤検出します。これは、すべてのバイト ペアが UTF-16LE で割り当てられた Unicode 文字と一致したためです。
文字セットの検出は、ISO-8859エンコーディングが混在するヨーロッパでは特に信頼性が低い。これらは密接に関連した8ビットエンコーディングであり、下位半分はASCIIと重複し、バイトのあらゆる配列が有効となる。これらのエンコーディングを技術的に区別する方法はなく、認識するには文字の出現頻度や綴りなどの言語的特徴を識別する必要がある。
ヒューリスティック検出は信頼性に欠けるため、データセットには適切なエンコーディングでラベル付けするのが望ましいです(「ドキュメントの文字エンコーディングの指定」を参照)。UTF-8とUTF-16は検出が容易ですが、一部のシステムでは、UTFエンコーディングの場合、ドキュメントにバイトオーダーマーク(BOM)を明示的に付加する必要があります。