Подготовка приложения PHP для использования с UTF-8

UTF-8 де-факто сейчас является стандартом для веб-приложений, но PHP это не кодировка по умолчанию для PHP (до 6.0). Большая часть сервера по умолчанию настроена на кодировку ISO-8859-1.

Как перегрузить настройки по умолчанию в .htaccess чтобы быть уверенным, что все идет хорошо для UTF-8, локали и т. д.? Любые варианты для веб-сервера, ОС Unix?

Есть ли исчерпывающий список этих настроек? Например mbstring опции, iconv настройки, локаль и т. д. Я должен настроить для каждого многоязычного проекта? Любой предопределенный .htaccess В качестве примера?

(В моем конкретном случае мне нужны настройки для языков: английский, голландский и русский. Сервер находится на Украине).

5 ответов

Решение

Несколько полезных опций .htaccess:

########################################
# Locale settings
########################################

# See: http://php.net/manual/en/timezones.php
php_value date.timezone "Europe/Amsterdam"

SetEnv   LC_ALL  nl_NL.UTF-8

########################################
# Set up UTF-8 encoding
########################################

AddDefaultCharset UTF-8
AddCharset UTF-8 .php

php_value default_charset "UTF-8"

php_value iconv.input_encoding "UTF-8"
php_value iconv.internal_encoding "UTF-8"
php_value iconv.output_encoding "UTF-8"

php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_output UTF-8
php_value mbstring.encoding_translation On
php_value mbstring.func_overload 6

# See also php functions:
# mysql_set_charset
# mysql_client_encoding

# database settings
#CREATE DATABASE db_name
#   CHARACTER SET utf8
#   DEFAULT CHARACTER SET utf8
#   COLLATE utf8_general_ci
#   DEFAULT COLLATE utf8_general_ci
#   ;
#
#ALTER DATABASE db_name
#   CHARACTER SET utf8
#   DEFAULT CHARACTER SET utf8
#   COLLATE utf8_general_ci
#   DEFAULT COLLATE utf8_general_ci
#   ;

#ALTER TABLE tbl_name
#   DEFAULT CHARACTER SET utf8
#   COLLATE utf8_general_ci
#   ;

Ты прав UTF-8 хороший выбор для веб-приложений.

Кодирование - это метаинформация данных, которые обрабатываются. Пока вы знаете кодировку (двоичных) данных, вы знаете, с чем имеете дело. Вы начинаете заблудиться, если не знаете кодировку. Я часто называю это цепочкой, если цепочка кодирования разорвана, данные будут разорваны. Это верно как для отображения данных, так и для безопасности.

Как правило, PHP является бинарным, контекст / вы задаете кодировку (например, как вы сохраняете файлы исходного кода php).

Итак, давайте рассмотрим короткий (и неполный) список:

ОС

Переменные среды могут рассказать вам об используемой локали и кодировке. Например, файловые системы имеют свою кодировку для имен файлов и каталогов. Я не очень тверд в этом вопросе, обычно мы пытаемся назвать наши файлы на английском языке, чтобы использовать только символы в диапазоне US-ASCII что безопасно для латинских расширенных кодировок, таких как ISO-8859-1 в вашем случае, а также для UTF-8,

Просто имейте это в виду, когда вы сохраняете файлы, которые загружают ваши пользователи: просто фильтруйте имена файлов по основным буквам и пунктуации, и у вас почти не будет проблем (a-z, A-Z, 0-9, ., -, _), даже сделать их все строчными для визуальных целей.

Если вы чувствуете, что это ухудшает удобство использования и файловая система не предлагает диапазон символов Юникода с UTF-8, вы можете вернуться к простым кодировкам, таким как rawurlencode (Percent-Encoding, triplet) и предлагают файлы для загрузки, разрешив это имя на диск.

Обычно вам просто нужно иметь дело с тем, что у вас есть. Начните расспрашивать обычного системного администратора или программиста о кодировке символов, и большинство из них скажет вам, что они на самом деле не заинтересованы. Естественно, это субъективно, но если вам нужен кто-то, чтобы настроить что-то для вас, это может иметь значение.

HTML

Это просто не зависит от PHP, это касается вывода, который ваши сценарии предоставляют для области работы.

Правило большого пальца: Укажите это. Если вы не указали это (HTML-файлы, CSS-файлы, файлы Javascript), не ожидайте, что это будет работать точно. Просто сделай это тогда. Кодирование - это цепочка, если есть много компонентов, убедитесь, что каждый знает о своей кодировке. В противном случае браузеры могут только догадываться. UTF-8 Это хороший выбор, но наша задача - позаботиться о том, чтобы это было точно и четко определено.

Настройки PHP

Как правило, начните читать php.ini файл, который поставляется вместе с пакетом PHP вашего дистрибутива Linux. Он поставляется с удобочитаемой документацией в комментариях и дальнейшими ссылками. Некоторые настройки, которые приходят мне в голову:

  • default_charset - PHP всегда выводит кодировку символов по умолчанию в заголовке Content-type:. Чтобы отключить отправку кодировки, просто установите ее как пустую ( Источник). Для получения общей информации см. Настройка параметра HTTP-кодировки W3C. Если вы хотите улучшить вывод вашего сайта, например, для сохранения информации о кодировке, когда пользователи сохраняют вывод в своем браузере, добавьте также метатег HTML http-эквивалента <meta http-equiv="Content-type" content="text/html;charset=UTF-8">,
  • output_handler - Этот параметр стоит посмотреть, так как он определяет обработчик вывода (Документы управления буферизацией вывода) и каждый обработчик (mb, iconv) может иметь свои собственные настройки кодирования (см. Строки).

Струны

  • Документы по строкам - по умолчанию строки в PHP являются двоичными. Пока вы используете их с бинарными безопасными функциями, вы получаете то, что ожидаете. Начиная с PHP 5.2.1, вы можете явным образом приводить строки в двоичные строки. Это для прямой совместимости упомянутой поддержки юникода PHP 6: $binary = (binary) $string; или же $binary = b"binary string";,
  • mb_internal_encoding() Документы - получить или установить его; mbstring.internal_encoding INI. Внутренняя кодировка - это имя кодировки символов, используемое для преобразования кодировки символов ввода HTTP, преобразования кодировки символов вывода HTTP и кодировки символов по умолчанию для строковых функций, определенных модулем mbstring.
  • iconv_set_encoding() Документы - Сравнимо для расширения iconv. Смотрите также настройки конфигурации iconv.
  • Различный: некоторые функции, которые имеют дело с последовательностями символов, позволяют вам указать кодировку кодировки. Например htmlspecialchars Документы Используйте эти параметры и проверьте документы на их значение по умолчанию. Часто это ISO-8859-1 но ты ищешь UTF-8, Другие функции, такие как html_entity_decode Документы используют UTF-8 по умолчанию. Некоторым нравится htmlspecialchars_decode вообще не указывайте кодировку, поэтому вам нужно прочитать исходный код PHP для конкретного конкретного понимания того, как функция работает с (двоичной) строкой.

Чтобы ответить на ваш вопрос: Необходимость настроек и параметров всегда зависит от компонентов, которые вы используете. Для основных, таких как браузер или веб-сервер, можно дать рекомендации по настройке, чтобы настроить его для UTF-8, Но от всего остального это зависит. Самое главное, чтобы найти его и убедиться, что вы знаете кодировку и можете настроить / указать ее. Часто это задокументировано. Пока вам не нужно иметь дело с переносимым кодом, это намного проще, так как у вас есть контроль над средой или вам нужно иметь дело только с конкретной средой. Пишите код в обороне с учетом кодировки, и все будет в порядке.

  1. Все ваши файлы должны быть сохранены в UTF-8 (без спецификации) с помощью вашего редактора кода.
  2. Веб-сервер может быть настроен на отправку неподходящих заголовков, поэтому рекомендуется переопределить их на уровне приложения. Например:

    header('Content-Type: text/html; charset=utf-8');
    
  3. Добавить мета-тип содержимого HTML:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    
  4. использование htmlspecialchars() вместо htmlentities() потому что первого достаточно в utf-8, а второе несовместимо с utf-8 по умолчанию.

  5. Не используйте стандартные строковые функции PHP, потому что многие из них несовместимы с utf-8. Попробуйте найти их аналоги в Multibyte String или других библиотеках. (Не забудьте установить кодировку по умолчанию для библиотеки перед ее использованием, поскольку библиотека поддерживает множество кодировок, а utf-8 - только одна из них.)
  6. Для регулярных выражений используйте модификатор u. Например:

    preg_match('/ž{3,5}/u', $string, $matches);
    

    Вместе это самый надежный способ проверить, является ли данная строка допустимой строкой utf-8:

    if (@preg_match('//u', $string) === false) {
        // NOT valid!
    } else {
        // Valid!
    }
    
  7. Если вы используете базу данных, всегда устанавливайте соответствующую кодировку соединения сразу после установления соединения. Пример для MySQL:

    mysql_set_charset('utf8', $link);
    

    Также проверьте, находятся ли столбцы в базе данных в utf-8. Это не всегда нужно, но рекомендуется.

В основном я делаю три вещи для правильной работы с чешским языком:

1) определить локаль в PHP:

setlocale(LC_COLLATE, "cs_CZ");
setlocale(LC_CTYPE, "cs_CZ");

так что вы бы использовали что-то вроде:

setlocale(LC_ALL, "en_US.utf8");
setlocale(LC_ALL, "nl_NL.utf8");

на основе языка, который в настоящее время переключен на.

2) определить кодировку для базы данных:

mysql_query("set names latin2 collate latin2_czech_cs");

3) определить кодировку кода PHP/HTML:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

Я не использую настройки.htaccess. Вы можете изменить это для своего случая, в локали использовать что-то вроде en_US.utf8 (на основе языка, который в настоящее время переключен на), в charset используйте utf-8 вместо latin2/iso-8859-2, и это должно работать хорошо.

Попробуйте одно из следующего:

 AddDefaultCharset UTF-8
 AddCharset UTF-8 .php
Другие вопросы по тегам