Как лучше всего настроить PHP для работы с веб-сайтом UTF-8 - PullRequest
17 голосов
/ 22 октября 2009

Какие расширения вы бы порекомендовали и как лучше настроить php для создания веб-сайта, который использует кодировку utf-8 для всего. например ...

  • Вывод страницы: utf-8
  • формы предоставляют данные в кодировке utf-8
  • внутренняя обработка строковых данных (например, при обращении к базе данных) также выполняется в utf-8.

Кажется, что php не очень хорошо справляется с многобайтовыми наборами символов в данный момент. До сих пор я выяснил, что mbstring выглядит как важное расширение.

Стоит ли хлопот ..?

Ответы [ 6 ]

50 голосов
/ 23 октября 2009

Предполагаемые проблемы PHP с контентом Unicode были несколько преувеличены. Я работаю на многоязычных веб-сайтах с 1998 года и никогда не знал, что могут возникнуть проблемы, пока не прочитал об этом где-нибудь - много лет и веб-сайты позже.

Это прекрасно работает для меня:

Конфигурация Apache (в httpd.conf или .htaccess)

AddDefaultCharset utf-8

PHP (в php.ini)

default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.http_output=UTF-8
mbstring.encoding_translation=On
mbstring.func_overload=6 

MySQL

CREATE ваша база данных с сопоставлением utf8_*, пусть таблицы наследуют параметры сортировки базы данных и начинать каждое соединение с "SET NAMES utf8"

HTML (в элементе HEAD)

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
3 голосов
/ 26 мая 2017

Я столкнулся с той же проблемой для UTF-8 characters, все работало на живом сервере и промежуточном сервере, но иногда оно ломалось на моей машине разработчика. Поведение было таким странным, иногда символы были закодированы правильно, но при случайной перезагрузке страницы оно начинало разрываться с Diamond Charters '���เห็นอเวิลด์!���' или Question mark '??�เห็นอเวิลด์!???' или 85% данные отображались правильно 'เห็นอเวิลด์!?��', но остальные 15% показывали несопоставленные символы. Я искал, чтобы решить проблему. Итак, началось с моего контрольного списка

1 - Проверить, добавлен ли заголовок символа в HTML


2 - Проверить, правильно ли сохранены данные в таблице MySQL


3 - Проверьте, есть ли в MySQL правильные настройки кодировки для UTF-8


4 - Проверить, есть ли в Apache настройки для работы с набором символов UTF-8


5 - Проверить, может ли простой PHP отображать вывод «เห็น อ เวิลด์» так же, как и ввод «เห็น อ เวิลด์»


6 - Проверить, отправляет ли PHP правильные выходные данные заголовков


7 - Проверить, получает ли MySQL Query такие же данные "เห็น อ เวิลด์"


8 - Проверьте, есть ли в «เห็น อ เวิลด์» символы html, разберитесь с ними правильно


9 - Проверить, проходит ли «เห็น อ เวิลด์» через функцию кодирования html-кодирования


10- Проверьте, установлен ли .htaccess для работы с набором символов UTF-8


Проверьте весь приведенный выше список, чтобы выяснить, где что-то ломается.

Попробуйте (я использую Codeigniter):

=================================
:: PHP ini Settings::
=================================

default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.http_output=UTF-8
mbstring.encoding_translation=On
mbstring.func_overload=6 

=================================
:: .htaccess Settings::
=================================

DefaultLanguage en-US
AddDefaultCharset UTF-8

=================================
:: HTML Header Page::
=================================

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

=================================
:: PHP Codeigniter index.php ::
=================================

header('Content-Type: text/html; charset=UTF-8');

=================================
:: Codeigniter config.php ::
=================================

$config['charset'] = 'UTF-8';

=================================
:: Codeigniter database.php ::
=================================

$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';

=================================
:: Codeigniter helper function (optional)
=================================

if(!function_exists('safe_utf_string')){
    function safe_utf_string($utf8string= ''){
        $utf8string = htmlspecialchars($utf8string, ENT_QUOTES, 'UTF-8');
        return mb_convert_encoding($utf8string, 'UTF-8');
    }
}

и, наконец, не забудьте сказать спасибо! :) на @ djn ответить

2 голосов
/ 22 октября 2009

php отлично справляется!

Вам следует установить для параметра php.ini "default_charset" значение utf-8.

Убедитесь, что: -

<head>
  <meta http-equiv="Content-Type"
    content="text/html; charset=utf-8"
    />

вверху каждой страницы, которую вы обслуживаете.

Есть несколько проблемных областей:

Базы данных - убедитесь, что они настроены на использование utf-8 по умолчанию, или войдите в мир боли.

IDE / Editors - многие редакторы не поддерживают utf-8. Я обычно использую vim, который не делает, но это никогда не было большой проблемой.

Документы - просто потратили целый день, чтобы получить php для чтения тайских символов из таблицы. В конце концов я добился успеха, но все еще не уверен, что сделал правильно.

1 голос
/ 22 октября 2009

В вашем php.ini установите

mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On

чтобы вам не приходилось каждый раз передавать параметр кодирования в функции mb_.

1 голос
/ 22 октября 2009

Если mbstring еще не является частью вашего PHP-пакета, то я определенно рекомендую его вам - вы даже захотите использовать его для вычисления длины строки (mb_strlen ($ string_var, 'utf8')) для ввода формы ... В противном случае вам не понадобится ничего, кроме правильного и правильного HTML, правильного http-server-config (чтобы сервер доставлял страницы без utf-8) и текстовый редактор с поддержкой utf-8 (например, Notepad ++).

0 голосов
/ 21 августа 2018

2018 Обновление :::

Пожалуйста, отметьте, что эти записи php.ini УСТАРЕЛИ;

;mbstring.internal_encoding = utf-8
;mbstring.http_input =
;mbstring.http_output = utf-8

Установка default_charset достаточна.

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