Это, похоже, проблема с кодировкой UTF-8, которая могла быть вызвана двойным кодированием UTF8 содержимого файла базы данных.
Такая ситуация может возникать из-за таких факторов, как набор символов, который был или не был выбран (например, при создании файла резервной копии базы данных), а также формат файла и файл базы данных кодирования, сохраненные с помощью.
Я видел эти странные символы UTF-8 в следующем сценарии (описание может быть не совсем точным, поскольку у меня больше нет доступа к рассматриваемой базе данных):
- Насколько я помню, в базе данных и таблицах имелось сопоставление "uft8_general_ci".
- Сделано резервное копирование базы данных.
- Файл резервной копии открывается в Windows в формате UNIX и в кодировке ANSI.
- База данных восстанавливается на новом сервере MySQL путем копирования содержимого из файла резервной копии базы данных в phpMyAdmin.
Просмотр содержимого файла:
- Открытие файла резервной копии SQL в текстовом редакторе показывает, что файл резервной копии SQL содержит странные символы, такие как «sॻ. С другой стороны, вы можете получить другие результаты, если откроете тот же файл в другом редакторе. Я использую TextPad здесь, но открытие того же файла в SublimeText говорит «sà ¥», потому что SublimeText правильно кодировал файл в UTF8 - тем не менее, это немного сбивает с толку, когда вы начинаете пытаться исправить проблему в PHP, потому что вы не видите Правильные данные в SublimeText в первую очередь. В любом случае, это можно решить, заметив, какую кодировку использует ваш текстовый редактор при представлении содержимого файла.
- Странные символы представляют собой символы UTF-8 с двойным кодированием, поэтому в моем случае первая часть «Ã» равна «Ã» и «Â ¥» = «¥» (это моя первая «кодировка»). Символы «Ã ¥» равны символу UTF-8 для «å» (это моя вторая кодировка).
Итак, проблема в том, что «false» (дважды кодированный в UTF8) utf-8 необходимо преобразовать обратно в «правильный» utf-8 (только один раз кодированный в UTF8) .
Попытка исправить это в PHP оказывается немного сложной задачей:
utf8_decode () не может обрабатывать символы.
// Fails silently (as in - nothing is output)
$str = "så";
$str = utf8_decode($str);
printf("\n%s", $str);
$str = utf8_decode($str);
printf("\n%s", $str);
iconv () завершается с ошибкой «Примечание: iconv (): обнаружен недопустимый символ во входной строке».
echo iconv("UTF-8", "ISO-8859-1", "så");
Другое прекрасное и возможное решение тоже не работает в этом сценарии
$str = "så";
echo html_entity_decode(htmlentities($str, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-15');
mb_convert_encoding () молча: #
$str = "så";
echo mb_convert_encoding($str, 'ISO-8859-15', 'UTF-8');
// (No output)
Попытка исправить кодировку в MySQL с помощью , преобразующей набор символов и сопоставление базы данных MySQL в UTF-8 , оказалась безуспешной:
ALTER DATABASE myDatabase CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE myTable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Я вижу несколько способов решить эту проблему.
Первое - сделать резервную копию с правильной кодировкой (кодировка должна соответствовать фактической базе данных и кодировке таблицы). Вы можете проверить кодировку, просто открыв полученный файл SQL в текстовом редакторе.
Другой способ - заменить символы с двойным UTF8 на символы с одиночным UTF8. Это можно сделать вручную в текстовом редакторе. Чтобы помочь в этом процессе, вы можете вручную выбрать неправильные символы из Диаграммы отладки кодировки Try UTF-8 (это может быть заменой 5-10 ошибок).
Наконец, скрипт может помочь в этом процессе:
$str = "så";
// The two arrays can also be generated by double-encoding values in the first array and single-encoding values in the second array.
$str = str_replace(["Ã","Â¥"], ["Ã","¥"], $str);
$str = utf8_decode($str);
echo $str;
// Output: "så" (correct)