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

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

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

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

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

Ответ 1

Некоторые полезные опции для .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
#   ;

Ответ 2

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

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

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

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

ОС

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

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

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

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

HTML

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

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

Настройки PHP

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

Строки

  • Строки Документы - По умолчанию строки в 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 Docs, используют UTF-8 по умолчанию. Некоторым вроде htmlspecialchars_decode не указывать кодировку вообще, поэтому вам нужно читайте исходный код PHP для конкретного конкретного понимания того, как функция имеет дело с (двоичной) строкой.

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

Ответ 3

  • Все ваши файлы должны быть сохранены в 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. Попробуйте найти их копии в Многобайтовой строке или других библиотеках. (Не забудьте установить набор символов по умолчанию для библиотеки, прежде чем использовать его, потому что библиотека поддерживает множество кодировок, а 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. Это не всегда необходимо, но рекомендуется.

Ответ 4

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

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 (в зависимости от языка, на котором в настоящее время переключается), в кодировке используйте utf-8 вместо latin2/iso-8859-2, и он должен хорошо работать.

Ответ 5

Попробуйте выполнить одно из следующих действий:

 AddDefaultCharset UTF-8
 AddCharset UTF-8 .php