Интернационализируйте рекомендации по использованию контента для использования utf8_encode () (функция php) - PullRequest
7 голосов
/ 10 сентября 2011

Чтобы веб-сайт мог принимать пользовательское содержимое, которое может быть не на английском языке (например, на японском языке), и сохранять его в базе данных, в моих ли интересах интересоваться utf8_encode всем новым контентом и пользователем utf8_decode при его получении позже?

Дополнительная информация: Я использую доктрину и получаю сообщение об ошибке при попытке сохранить или выбрать символы Unicode в базе данных MySQL:

SQLSTATE [HY000]: общая ошибка: 1267 Недопустимое сочетание параметров сортировки (latin1_swedish_ci, IMPLICIT) и (utf8_general_ci, COERCIBLE) для операции '='

Ответы [ 2 ]

8 голосов
/ 10 сентября 2011

Вам не нужно использовать функцию кодирования. Что вам нужно сделать, это убедиться, что вы UTF8 от начала до конца. Похоже, ваша база данных использует кодировку и сортировку latin1. Ваше соединение с базой данных также должно быть UTF8. Иногда это просто вопрос выполнения запроса SET NAMES UTF8 сразу после установления соединения.

Выполнение этой команды в mysql, скорее всего, устранит ошибку, которую вы видите выше, но вам все равно нужно быть сквозным UTF8. Тогда вам не нужно делать ничего особенного с вашими данными.

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
5 голосов
/ 10 сентября 2011

Брент прав. Это должно быть сквозным. Вот мой список:

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'");
...