Поиск…


замечания

  • Вы должны убедиться, что каждый раз, когда вы обрабатываете строку UTF-8, вы делаете это безопасно. Это, к сожалению, тяжелая часть. Вероятно, вы захотите широко использовать mbstring PHP mbstring .

  • Встроенные строковые операции 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' .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow