Я получил эту базу данных, полную имен людей и данных на французском языке, что означает использование таких символов, как é, è, ö, û и т. Д. Около 3000 записей.
Судя по всему, данные внутри кодировались иногда с использованием utf8_encode (), а иногда - нет. Это приводит к неправильному выводу: в некоторых местах символы отображаются нормально, в других - нет.
Сначала я попытался отследить каждое место в пользовательском интерфейсе, где возникают эти проблемы, и использовать utf8_decode () там, где это необходимо, но это действительно не практичное решение.
Я провел некоторое тестирование, и нет причин использовать utf8_encode в первую очередь, поэтому я бы предпочел все это удалить и просто работать в UTF8 везде - на уровне браузера, промежуточного программного обеспечения и базы данных. Поэтому мне нужно очистить базу данных, преобразовав все неправильно закодированные данные в ее очищенную версию.
Вопрос: можно ли создать в php функцию, которая проверяла бы, правильно ли закодирована строка utf8 (без utf8_encode) или нет (с utf8_encode), и, если да, преобразовывала бы ее обратно в исходное состояние?
Другими словами: я хотел бы знать, как я могу обнаружить содержимое utf8, которое было от utf8_encode () до содержимого utf8, которое не было utf8_encode () d.
** ОБНОВЛЕНИЕ: ПРИМЕР **
Вот хороший пример: вы берете строку, полную специальных символов, и берете копию этой строки и ее utf8_encode (). Функция, о которой я мечтаю, берет обе строки, оставляет первую нетронутой, а вторая строка теперь такая же, как и первая строка.
Я пробовал это:
$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: éèöûêïà
Спасибо,
Алекс