Как правильно обрабатывать международный символ в PHP / MySQL / Apache - PullRequest
2 голосов
/ 13 ноября 2009

Мне нужно создать приложение на PHP, которое может обрабатывать все символы Unicode во всех местах - поля редактирования, статический HTML, база данных. Может кто-нибудь сказать мне полный список всех параметров / функций, которые необходимо установить / использовать для достижения этой цели?

Ответы [ 5 ]

7 голосов
/ 13 ноября 2009

Apache

Кодировка сервера должна быть либо не задана, либо установлена ​​в UTF-8. Это делается с помощью директивы apache AddDefaultCharset. Это может перейти на виртуальный хост или в общий файл (см. Документацию).

AddDefaultCharset utf-8

MySql

  • Установить для сортировки базы данных значение UTF-8
  • Установить кодировку соединения. Это можно сделать, как кто-то сказал с mysqli_set_charset, или отправив это сразу после подключения:
    SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'

PHP

1- Вы должны установить кодировку HTML страницы на UTF-8, через метатег на странице или через заголовок PHP:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-or-
    header('Content-type: text/html; charset=utf-8');

2 - Вы всегда должны использовать версию mb * связанных со строкой функций, например, mbstrlen вместо strlen, чтобы получить длину строки.

Это должно позволить вам иметь UTF-8 везде, от страниц до данных. Тест, который вы можете сделать: щелкните правой кнопкой мыши в любом месте страницы с помощью Firefox и выберите Показать информацию о странице. Эффективная кодировка указана на этой странице.

1 голос
/ 17 ноября 2009

Вам было рекомендовано использовать HTTP-заголовок или мета-элемент, чтобы установить кодировку на ваших страницах в utf-8. W3C рекомендует вам оба варианта. И метаэлемент должен появиться как можно раньше на странице. (Все символы перед метаэлементом должны быть ASCII, который в основном идентичен почти во всех кодировках символов. Некоторые браузеры перезапускают рендеринг страницы, когда сталкиваются с метатегом, что является еще одной веской причиной, чтобы это было раньше.)

Кроме того, на всех формах, принимающих пользовательский ввод, необходимо указать атрибут accept-charset="utf-8". Обычно браузеры, отправляющие данные POST, по умолчанию используют кодировку страницы, но быть уверенным, что это не вредно.

1 голос
/ 13 ноября 2009

Некоторые вещи, которые вам нужно будет изучить: -

PHP

Убедитесь, что ваш контент помечен как utf-8:

default_charset = "utf-8"

Установить mbstring. Вы можете найти это здесь

Убедитесь, что вы говорите с utf-8 между PHP и MySQL.
Звоните mysql_set_charset("utf8"); (или используйте SQL-запрос SET NAMES utf8)

Apache

Вы также устанавливаете Content-Type: ваших страниц здесь с чем-то вроде этого

AddDefaultCharset utf-8

MySQL

Убедитесь, что все ваши таблицы используют utf8 Collation utf8_general_ci; например,

ALTER DATABASE mydb CHARACTER SET utf8;

Наконец

Наконец, протестируйте материал с забавными примерами Unicode, как эти

9 (͡ ๏ ̯͡ ๏) 6

Более полезная информация с , когда я попробовал это ...

1 голос
/ 13 ноября 2009

Важно: Вы также должны убедиться, что вы используете UTF-8 в качестве кодировки соединения при подключении к Mysql из PHP!

Для mysqli это делается

mysqli_set_charset($dblink, 'utf-8')

http://de3.php.net/manual/en/mysqli.set-charset.php

0 голосов
/ 24 ноября 2009

Я использовал упомянутые методы, и они работали нормально. До недавнего времени, когда мой провайдер обновил PHP до 5.2.11 и MySQL до 5.0.81-сообщества. После этого изменения символы юникода были правильно извлечены из базы данных, но все обновления были повреждены, а символы юникода заменены на «?».

Решение было использовать:

mysql_set_charset('utf8',$conn);

Требовалось, хотя мы использовали:

SET NAMES utf8
SET CHARACTER SET utf8

Также - поскольку мы использовали ADOdb, нам нужно было найти дескриптор соединения PHP. Мы использовали следующее утверждение:

mysql_set_charset('utf8',$adoConn->_connectionID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...