Проблемы с кодировкой utf-8 в php - PullRequest
2 голосов
/ 21 мая 2010

Еще одна проблема, связанная с utf-8, я считаю ...

Я использую php для обновления данных в базе данных mysql, а затем отображаю эти данные в другом месте сайта. Ранее у меня возникали проблемы с utf-8, когда специальные символы отображались в виде вопросительных знаков при просмотре в браузере, но этот выглядит немного иначе.

У меня есть несколько записей для ввода, которые содержат символ è. Если я ввожу это непосредственно в базу данных, то это правильно отображается на странице, поэтому я понимаю, что это означает, что содержимое utf-8 выводится правильно.

Однако, когда я пытаюсь обновить значения в БД через php, символ è заменяется. Вместо этого появляется & Atilde; & uml; (без пробелов), который отображается в браузере как è

У меня есть таблицы в базе данных, настроенные на использование UTF-8. Я считаю, что это правильно, потому что, как уже упоминалось, если я обновлю БД через phpMyAdmin, все нормально. Точно так же я установил кодировку символов для страницы, которая кажется правильной. Я также запускаю SQL-оператор "SET NAMES 'utf8';" прежде чем пытаться обновить БД.

У кого-нибудь есть другие идеи относительно того, где может быть проблема?

Большое спасибо

Ответы [ 4 ]

3 голосов
/ 21 мая 2010

Да.

Персонаж, который у вас есть, МАЛЕНЬКОЕ ЛАТИНСКОЕ ПИСЬМО E С МОЛОДОЙ . Как видите, в UTF-8 этот символ кодируется в два байта 0xC3 и 0xA8.

Но во многих западных кодировках по умолчанию (таких как ISO-8859-1), которые являются только однобайтовыми, этот многобайтовый символ декодируется как два отдельных символа, LATIN CAPITAL LETTER A WITH TILDE и ДИАРЕЗИС . Обратите внимание, как они оба закодированы как C3 и A8 в ISO-8859-1?

Более того, похоже, что PHP обрабатывает эти символы с помощью htmlentities () , что приводит к Ã и ¨ соответственно.

Итак, где именно проблема в вашем коде? Ну, htmlentities() мог бы делать все сам по себе, поскольку его третий аргумент - это имя кодировки, которое вы, возможно, неправильно установили на 'UTF-8'. Но это может быть и другая функция обработки строк. (Примечание. Как правило, нехорошо хранить объекты HTML в базе данных - этот шаг должен быть зарезервирован для времени отображения)

Есть множество других способов, чтобы подружиться с UTF-8 в php - я советую набрать шпаргалку и убедиться, что вы в хорошей форме.

1 голос
/ 21 мая 2010

Ну, это ваш собственный код для преобразования символов в сущности.
Чтобы сделать это правильно:

  1. Запрет htmlentities функция из ваших сценариев навсегда.
  2. Используйте htmlspecialchars, но не на вставке, а для отображения данных.
  3. Восстановить существующие данные в базе данных, используя html_entity_decode.
0 голосов
/ 21 мая 2010

Я думаю, что вы пропустили объявление Content-Type на html-странице:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Если у вас его нет, браузер будет угадывать кодировку и преобразовывать любые символы вне этой кодировки в сущности при публикации формы.

0 голосов
/ 21 мая 2010

Полагаю, вы берете результаты какой-либо отправки формы и вставляете результаты в базу данных. Если это так, вы должны убедиться, что вы указали браузеру отправку данных UTF-8, а также должны подтвердить правильность ввода пользователя для действительного потока UTF-8.

Измените элемент формы, чтобы включить accept-charset:

<form accept-charset="utf-8" method="post" ... >
    <input type="text name="field" />
    ...
</form>

Подтвердите данные с помощью:

$valid = array_key_exists("field", $_POST) && !is_array($_POST['field']) &&
    preg_match('//u', $_POST['field']) && ...; //check length with mb_strlen etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...