Подготовка приложения 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
, Но от всего остального это зависит. Самое главное, чтобы найти его и убедиться, что вы знаете кодировку и можете настроить / указать ее. Часто это задокументировано. Пока вам не нужно иметь дело с переносимым кодом, это намного проще, так как у вас есть контроль над средой или вам нужно иметь дело только с конкретной средой. Пишите код в обороне с учетом кодировки, и все будет в порядке.
- Все ваши файлы должны быть сохранены в UTF-8 (без спецификации) с помощью вашего редактора кода.
Веб-сервер может быть настроен на отправку неподходящих заголовков, поэтому рекомендуется переопределить их на уровне приложения. Например:
header('Content-Type: text/html; charset=utf-8');
Добавить мета-тип содержимого HTML:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
использование
htmlspecialchars()
вместоhtmlentities()
потому что первого достаточно в utf-8, а второе несовместимо с utf-8 по умолчанию.- Не используйте стандартные строковые функции PHP, потому что многие из них несовместимы с utf-8. Попробуйте найти их аналоги в Multibyte String или других библиотеках. (Не забудьте установить кодировку по умолчанию для библиотеки перед ее использованием, поскольку библиотека поддерживает множество кодировок, а utf-8 - только одна из них.)
Для регулярных выражений используйте модификатор u. Например:
preg_match('/ž{3,5}/u', $string, $matches);
Вместе это самый надежный способ проверить, является ли данная строка допустимой строкой utf-8:
if (@preg_match('//u', $string) === false) { // NOT valid! } else { // Valid! }
Если вы используете базу данных, всегда устанавливайте соответствующую кодировку соединения сразу после установления соединения. Пример для 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