Неверное кодирование символов из формы 2-3% времени

У меня есть форма в PHP, которая передает данные в MySQL.

Если посмотреть на данные в базе данных, я вижу, что около 2-3% строк содержат международные символы, которые кодируются некорректно, например, «Guðrún» отображается как «Guà ° rún».

Но другой пользователь может отправить те же символы всего несколько минут спустя, и в этом случае символы будут закодированы правильно

Таким образом, кажется, что кодировка зависит от используемого компьютера или какого-то другого фактора, о котором я не знаю.

В голове HTML у меня есть следующее:

<meta charset="ISO-8859-1">

Форма имеет следующее:

<form autocomplete="on" method="post" action="index.php" id="form1" accept-charset="ISO-8859-1">

В столбцах MySQL задано значение latin1_swedish_ci.

Есть ли что-то еще, что я должен сделать, чтобы сделать эту работу для всех?

Изменить: поскольку он был отмечен как дубликат, я не могу найти ответ на этот вопрос в другом месте. Я прочитал много информации о кодировке символов, которая привела меня к установке, которую я сейчас имею, но это не объясняет, почему 2-3% данных ведут себя по-другому от остальных.

Всего 1 ответ


Этот тип ошибки называется Mojibake. Здесь обсуждаются причины

Но ... Кажется, вы подразумеваете, что в некоторых рядах есть Mojibake, в то время как в других строках есть хорошие акцентированные символы? Если это так, то это ошибка клиента. Некоторые клиенты используют latin1, некоторые используют utf8. Нехорошо смешиваться на этом уровне.

Однако, если вы смешиваете этот путь, убедитесь, что каждый клиент объявляет CHARACTER SET соответствующим его байтам. Это лучше всего сделать с помощью параметров соединения, но также можно выполнить с помощью SET NAMES ... Вот некоторые бессвязные заметки о PHP

Поскольку eth и u-sharp существуют в latin1 , возможно, что столбец таблицы и / или клиент могут быть установлены как latin1, так и utf8mb4, вы можете подумать о переходе на utf8 для будущей проверки базы данных.

«Изменение взад-вперед» может быть опасным - особенно если вы используете «неправильный» ALTER . Пожалуйста, укажите SELECT col, HEX(col) ... Гек для Guðrún :

if latin1:           47 75     F0    72     FA    6E
if utf8/utf8mb4:     47 75    C3B0   72    C3BA   6E
if 'double encoded': 47 75 C383 C2B0 72 C383 C2BA 6E

Есть идеи?

10000