У меня есть MySQL со строками, который я некоторое время оставил бездействующим. Теперь, когда я поднял его снова, я заметил, что все специальные символы испорчены. Мой провайдер перенес сервер на другую машину, я подозреваю, что это может произойти, когда это произошло.
База данных была заполнена PHP-скриптом. Все должно было быть в UTF-8, вот что настроено для базы данных.
Однако вот так выглядит строка:
fête
Предполагается, что эти четыре специальных символа будут одним символом, ê
, строка должна быть fête
.
Теперь похоже, что это просто дважды перекодируется, но это не так. Эти четыре символа в шестнадцатеричном формате:
C3 83 C6 92 C3 82 C2 AA
Это очень похоже на UTF-8, поэтому, если мы расшифруем его, мы получим
C3 3F C2 AA
Это не совсем UTF-8 (из-за 3F
), но давайте расшифруем его снова:
FF AA
Это не UTF-8.
Символ ê
- это EA
, в UTF-8 это будет C3 AA
.
Другой пример. Испанский перевернутый вопросительный знак (¿
) обозначен как C8 83 E2 80 9A C3 82 C2
, который декодируется в C3 3F 82 BF
, что опять не соответствует UTF-8 (переводится в FF 82 BF
). Ожидаемый символ для ¿
равен BF
, т.е. C2 BF
в соответствующем UTF-8.
Что здесь произошло? Как персонажи запутались? Что еще более важно, как я могу это исправить?
(Примечание: новый сервер требует от меня записи mysql_set_charset("utf8");
, иначе строки тоже будут испорчены, хотя и в стиле "UTF-8 as latin1", а не так странно, как показано выше.)
TL; ДР: * +1051 *
- База данных MySQL была заполнена в UTF-8 через скрипт PHP
- В течение нескольких лет простаивал, сервер был перенесен.
- Теперь символы перепутаны, см. Выше.