Интернационализация лучших практик для использования utf8_encode() (функция php)
Чтобы веб-сайт мог принимать пользовательское содержимое, которое может быть не на английском языке (например, на японском языке), и сохранять его в базе данных, в моих ли интересах интересовать utf8_encode всем новым контентом и пользователем utf8_decode при его получении позже?
Дополнительная информация: я использую доктрину и получаю сообщение об ошибке при попытке сохранить или выбрать символы Unicode в базе данных MySQL:
SQLSTATE [HY000]: общая ошибка: 1267 Недопустимое сочетание параметров сортировки (latin1_swedish_ci,IMPLICIT) и (utf8_general_ci,COERCIBLE) для операции '='
2 ответа
Вам не нужно использовать функцию кодирования. Что вам нужно сделать, это убедиться, что вы UTF8 от начала до конца. Похоже, что ваша база данных может использовать латинскую кодировку и сопоставление. Ваше соединение с базой данных также должно быть UTF8. Иногда это просто вопрос выполнения запроса SET NAMES UTF8 сразу после установления соединения.
Выполнение этой команды в mysql, скорее всего, устранит ошибку, которую вы видели выше, но вам все равно нужно быть сквозным UTF8. Тогда вам не нужно делать ничего особенного с вашими данными.
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Брент прав. Это должно быть сквозным. Вот мой список:
Apache config:
AddDefaultCharset UTF-8
AddCharset UTF-8 .utf8
php.ini:
default_charset = "utf-8"
MySQL:
ALTER DATABASE DEFAULT CHARACTER SET utf8;
ALTER TABLE SomeTableName DEFAULT CHARACTER SET utf8;
PHP/HTML:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
…
<form … <input type="text" name="some_field" value="<?php echo htmlspecialchars($row['some_field'], ENT_COMPAT, 'UTF-8'); ?>"…
This last one seems the most important. Call this function immediately after the mysql_connect() call:
mysql_query("SET NAMES 'utf8'");