Изменение кодировки символов в MySQL, PHP-скриптах, HTML - PullRequest
3 голосов
/ 07 июня 2010

Итак, я довольно долго строил эту систему, и в настоящее время она выводит Latin1 (ISO-8859-1) в веб-браузер, и это компоненты:

MySQL - все данные хранятся с набором символов Latin1

PHP - все текстовые файлы PHP хранятся на диске с кодировкой Latin1

HTML - Вывод имеет метатег http-экв = "тип контента" контент = "текст / html; charset = iso-8859-1"

Итак, я пытаюсь понять, как кодирование различных частей влияет на мой рабочий процесс. Если я открою PHP-скрипт и изменит его кодировку в текстовом редакторе на UTF-8 и сохраню его обратно на диск и перезагрузлю веб-браузер, весь текст будет испорчен - если только текст не поступает из БД. Если я изменю кодировку БД на UTF-8 и сохраню PHP-файлы в латинице 1, я должен использовать utf8_decode () для правильного отображения данных. И если я изменю код HTML, браузер прочитает его неправильно.

Так что да, я понимаю, что если я хочу «обновить» до UTF8, мне нужно обновить все три части этой установки, чтобы она работала правильно, но так как это огромная система с некоторыми 180-тысячными строками PHP-кода и миллионами сообщений во многих базах данных / таблицах, я не хочу начинать что-то подобное, не понимая все правильно.

О чем я не думал? Что может испортить все это без исправления? Каковы процедуры изменения кодировки всей установки MySQL и какой самый простой способ изменить кодировку сотен или тысяч файлов PHP на диске?

К счастью, мета-тег добавляется динамически, поэтому я изменю его только в одном месте:)

Позвольте мне услышать о вашем опыте с этим.

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Это сложно.

Вы должны:

  • изменить БД и все таблицы символов / кодировки - я не очень разбираюсь в MySQL, но см. здесь
  • установить кодировку клиента в UTF-8 в PHP (SET NAMES UTF8) перед первым запросом
  • изменить метатег и, возможно, заголовок типа содержимого (обратите внимание, что заголовок типа содержимого имеет приоритет)
  • преобразовать все файлы PHP в UTF-8 без спецификации - вы можете легко сделать это с помощью цикла и iconv.
  • самая хитрая из всех: вам нужно изменить большинство ваших вызовов строковых функций . Чем означает mb_strlen вместо strlen, mb_substr вместо substr и $str[index] и т. Д.
0 голосов
/ 07 июня 2010

Не конвертируйте в UTF8, если вам не нужно. Это не стоит хлопот.
UTF8 является (становится) новым стандартом, поэтому я могу рекомендовать его для новых проектов.

Функция
Некоторые вызовы функций больше не работают. Для латиницы 1 это:

 echo htmlentities($string);

Для UTF8 это:

 echo htmlentities($string, ENT_COMPAT, 'UTF-8');

strlen (), substr () и т. Д. Не знают о многобайтовых символах.

MySQL
mysql_set_charset('UTF8') или mysql_query('SET NAMES UTF8') преобразует весь текст в UTF8, поступающий из базы данных (SELECTs). Он также преобразует входящие строки (INSERT, UPDATE) из UTF8 в кодировку таблицы.

Таким образом, для чтения из таблицы latin1 нет необходимости преобразовывать кодировку таблицы.
Но некоторые символы доступны только в юникоде (например, снеговик ☃, смайлики iPhone и т. Д.) И не могут быть преобразованы в латиницу1. (Данные будут усечены)

Сценарии
Я пытаюсь предотвратить использование спецсимволов в моих php-скриптах / шаблонах.
Я использую нотацию ë вместо ë и т. Д. Таким образом, не имеет значения, сохранен ли он в latin1 или utf8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...