あなたの古いエンコーディングは、おそらくラテン語 1 でしたか?
文字列が UTF-8 ではなく Latin-1 でエンコードされた時期は、連続するバイトを調べることでおそらく検出できます。UTF-8 標準には、テキストの一部が Latin-1 または UTF-8 でエンコードされているかどうかを検出するために使用できる、独特のコードページ レイアウトがあります。
00 ~ 7F の範囲のバイトはすべて安全です。もちろん、これらは ASCII 値であり、これらのコードポイントは 2 つのエンコーディング間で一致します。ここには助けはありません、助けは必要ありません。
バイト C0、C1、および F5-FF は、UTF-8 エンコーディングでは無効です。これらを含む文字列は、Latin-1 でエンコードする必要があります。
C2-DF の範囲のバイトの後には、80-BF の範囲のバイトが続く必要があります。これに一致しない 2 バイトがある場合は、Latin-1 でエンコードされた文字列が手元にある可能性があります。
これまでにエンコードしたのが Latin-1 文字 (Unicode コード ポイント 255 まで) だけである場合は、ここで終了できます。E0 から FF の範囲のバイトを含むものはすべて、古い Latin-1 データになります。
切り替えてから UTF-8 でデータを追加した場合、それは Latin-1 の範囲外です。次のルールも含める必要があります。
- E0 ~ EF の範囲のバイトは、3 バイトの UTF-8 文字を示します。次の 2 バイトは、再び 80 ~ BF の範囲に収まる必要があります。
3 UTF-8 バイト データはBMPの残りの部分をカバーします。これ以外でエンコードすることはほとんどありません。ただし、これ以外でエンコードする場合は、次を探します。
- F0 ~ F4 の範囲のバイトの後には、80 ~ BF の範囲の正確に 3 バイトが続く必要があります。
これらの基準がすべて一致する場合、文字列はおそらくUTF-8 ですが、100% 確実というわけではありません。それらのいずれかが一致しない場合は、間違いなく Latin-1 文字列を持っています。しかし、Latin-1 コードポイント C2-DF の後にコードポイント 80-BF が続く可能性はほとんどありません。後者のほとんどは制御コードか、より難解な分音記号であるためです。おそらく、複数の 2 バイト UTF-8 シーケンスを探して信頼スコアを上げることで、さらに絞り込むことができます。
したがって、結論として (tl;dr):マルチバイト シーケンスを調べることで、Latin-1 でエンコードされたほとんどの文字列を見つけることができます。それらが厳格な UTF-8 基準に該当しない場合は、Latin-1 文字列が手元にあります。