Неправильная кодировка символов в форме 2-3% времени - PullRequest
0 голосов
/ 19 октября 2018

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

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

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

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

В главе HTML, у меня есть это:

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

Форма имеетthis:

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

Для столбцов MySQL установлено значение latin1_swedish_ci.

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

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

1 Ответ

0 голосов
/ 21 октября 2018

Этот тип ошибки называется 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...