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

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

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

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

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


person Sfisioza    schedule 08.08.2011    source источник
comment
PHP 6.0 нет и никогда не будет; по крайней мере, не так, как мы ожидали.   -  person Pascal MARTIN    schedule 09.08.2011
comment
@hakre, Паскаль; Правильно, я имел в виду Unicode, а не UTF-8   -  person Sfisioza    schedule 09.08.2011


Ответы (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
#   ;
person takeshin    schedule 08.08.2011

Вы правы, 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. Он поставляется с читаемой документацией в комментариях и дополнительных ссылках. Некоторые настройки, которые приходят мне на ум:

Струны

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

person hakre    schedule 08.08.2011
comment
В чем разница между iconv и mb_string? - person CMCDragonkai; 07.01.2014

  1. Все ваши файлы должны быть сохранены в UTF-8 (без BOM) с помощью вашего редактора кода.
  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. Это не всегда необходимо, но рекомендуется.

person Karolis    schedule 08.08.2011
comment
Требует ли модификатор /u в регулярных выражениях каких-либо специальных обозначений для символов Юникода? - person Sfisioza; 11.08.2011
comment
@Sfisioza Не уверен, что понимаю, что ты имеешь в виду. Если вы хотите, вы можете использовать эту запись для символов Юникода: \x{nnnn}. Но обычно это не нужно, если ваши файлы сохранены в UTF-8, потому что вы можете писать символы юникода непосредственно в регулярном выражении, как я сделал в своем примере. В UTF-8 некоторые символы занимают более 1 байта. Допустим, у нас есть это регулярное выражение: /ž{3}/u. Здесь число 3 означает символы (не байты), когда включен модификатор u. Вместе есть специальные свойства юникода для регулярных выражений: php.net/manual/ ru/regexp.reference.unicode.php - person Karolis; 11.08.2011
comment
Спасибо, это то, о чем я спрашивал. - person Sfisioza; 11.08.2011

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

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, и это должно работать хорошо.

person Tomas    schedule 08.08.2011

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

 AddDefaultCharset UTF-8
 AddCharset UTF-8 .php
person djdy    schedule 08.08.2011