Поиск…
замечания
Вы должны убедиться, что каждый раз, когда вы обрабатываете строку UTF-8, вы делаете это безопасно. Это, к сожалению, тяжелая часть. Вероятно, вы захотите широко использовать
mbstring
PHPmbstring
.Встроенные строковые операции PHP по умолчанию не являются безопасными для UTF-8. Есть некоторые вещи, которые вы можете безопасно выполнять с обычными строковыми операциями PHP (например, конкатенация), но для большинства вещей вы должны использовать эквивалентную функцию
mbstring
.
вход
Вы должны проверить каждую полученную строку как действительную UTF-8, прежде чем пытаться ее сохранить или использовать в любом месте. PHP
mb_check_encoding()
делает трюк, но вы должны использовать его последовательно. На самом деле этого не происходит, так как вредоносные клиенты могут отправлять данные в любой кодировке, которую они хотят.$string = $_REQUEST['user_comment']; if (!mb_check_encoding($string, 'UTF-8')) { // the string is not UTF-8, so re-encode it. $actualEncoding = mb_detect_encoding($string); $string = mb_convert_encoding($string, 'UTF-8', $actualEncoding); }
Если вы используете HTML5, вы можете игнорировать эту последнюю точку. Вы хотите, чтобы все данные, отправленные вам браузерами, были в UTF-8. Единственный надежный способ сделать это - добавить атрибут
accept-charset
ко всем тэгам<form>
следующим образом:<form action="somepage.php" accept-charset="UTF-8">
Выход
Если ваше приложение передает текст другим системам, они также должны быть проинформированы о кодировке символов. В PHP вы можете использовать опцию
default_charset
вphp.ini
или вручную самостоятельно заголовокContent-Type
MIME. Это предпочтительный метод при ориентации на современные браузеры.header('Content-Type: text/html; charset=utf-8');
Если вы не можете установить заголовки ответов, вы также можете установить кодировку в документе HTML с метаданными HTML .
HTML5
<meta charset="utf-8">
Старые версии HTML
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Хранение и доступ к данным
В этом разделе конкретно говорится о UTF-8 и соображениях по его использованию с базой данных. Если вы хотите получить дополнительную информацию об использовании баз данных в PHP, обратитесь к этой теме .
Хранение данных в базе данных MySQL:
- Укажите
utf8mb4
символовutf8mb4
во всех таблицах и текстовых столбцах в базе данных. Это делает MySQL физически хранить и извлекать значения, закодированные изначально в UTF-8.MySQL будет неявно использовать кодировку
utf8mb4
если будетutf8mb4_*
сортировкаutf8mb4_*
(без какого-либо явного набора символов). - Старые версии MySQL (<5.5.3) не поддерживают
utf8mb4
поэтому вы будете вынуждены использоватьutf8
, который поддерживает только подмножество символов Unicode.
Доступ к данным в базе данных MySQL:
В вашем коде приложения (например, PHP) в любом используемом методе доступа к БД вам нужно установить кодировку соединений в
utf8mb4
. Таким образом, MySQL не выполняет преобразование из собственного UTF-8, когда он передает данные в ваше приложение и наоборот.Некоторые драйверы предоставляют собственный механизм для настройки набора символов соединения, который обновляет собственное внутреннее состояние и информирует MySQL о кодировке, которая будет использоваться в соединении. Обычно это предпочтительный подход.
Например (то же самое касается
utf8mb4
/utf8
применяется, как указано выше):Если вы используете слой абстракции PDO с PHP ≥ 5.3.6, вы можете указать
charset
в DSN :$handle = new PDO('mysql:charset=utf8mb4');
Если вы используете mysqli , вы можете вызвать
set_charset()
:$conn = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db'); $conn->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($conn, 'utf8mb4'); // procedural style
Если вы застряли в простой mysql, но, возможно, используете PHP ≥ 5.2.3, вы можете вызвать
mysql_set_charset
.$conn = mysql_connect('localhost', 'my_user', 'my_password'); $conn->set_charset('utf8mb4'); // object oriented style mysql_set_charset($conn, 'utf8mb4'); // procedural style
Если драйвер базы данных не предоставляет свой собственный механизм для установки набора символов соединения, вам может потребоваться выдать запрос, чтобы сообщить MySQL, как ваше приложение ожидает, что данные о соединении будут закодированы:
SET NAMES 'utf8mb4'
.