フランス語の人の名前とデータでいっぱいのこのデータベースを受け取りました。つまり、é、è、ö、ûなどの文字を使用しています。約3000エントリ。
どうやら、内部のデータはutf8_encode()を使用してエンコードされている場合と、そうでない場合があります。これにより、出力が混乱します。一部の場所では文字が正常に表示され、他の場所では表示されません。
最初は、これらの問題が発生するUIのすべての場所を追跡し、必要に応じてutf8_decode()を使用しようとしましたが、実際には実用的な解決策ではありません。
私はいくつかのテストを行いましたが、そもそもutf8_encodeを使用する理由はないので、すべてを削除して、ブラウザー、ミドルウェア、データベースの各レベルでUTF8で作業したいと思います。したがって、データベースをクリーンアップして、誤ってエンコードされたすべてのデータをクリーンアップされたバージョンで変換する必要があります。
質問:utf8文字列が正しくエンコードされているか(utf8_encodeなし)、正しくエンコードされていないか(utf8_encodeあり)をチェックする関数をphpで作成し、エンコードされている場合は元の状態に戻すことはできますか?
言い換えると、utf8_encode()されていないutf8コンテンツからutf8_encode()されていないutf8コンテンツを検出する方法を知りたいです。
**更新:例**
これが良い例です:あなたは特別な文字でいっぱいの文字列を取り、その文字列のコピーを取り、それをutf8_encode()します。私が夢見ている関数は両方の文字列を受け取り、最初の文字列はそのままにして、2番目の文字列は文字列1と同じになります。
私はこれを試しました:
$loc_fr = setlocale(LC_ALL, 'fr_BE.UTF8','fr_BE@euro', 'fr_BE', 'fr', 'fra', 'fr_FR');
$str1= "éèöûêïà ";
$str2 = utf8_encode($str1);
function convert_charset($str) {
$charset= mb_detect_encoding($str);
if( $charset=="UTF-8" ) {
return utf8_decode($str);
}
else {
return $str;
}
}
function correctString($str) {
echo "\nbefore: $str";
$str= convert_charset($str);
echo "\nafter: $str";
}
correctString($str1);
echo('<hr/>'."\n");
correctString($str2);
そしてそれは私に与えます:
before: éèöûêïà after: �������
before: éèöûêïà after: éèöûêïà
ありがとう、
アレックス