Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: SfisiozaОтветов: 5

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

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

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

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

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

phpunicodeutf-8character-encodingwebserver

Ответы

Ответ 1 · рейтинг 15 · takeshin

Несколько полезных опций в .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 · рейтинг 5 · hakre

Вы правы, 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. А вот со всем остальным зависит. Самое главное найти его и убедиться, что вы знаете кодировку и можете настроить/указать ее. Часто это задокументировано. Пока вам не нужно иметь дело с переносимым кодом, это намного проще, поскольку вы контролируете среду или вам нужно иметь дело только с определенной средой. Пишите код с осторожностью, помня о кодировании, и все будет в порядке.

Ответ 3 · рейтинг 3 · Karolis

  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. Это не всегда необходимо, но рекомендуется.

Ответ 4 · рейтинг 1 · Tomas

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

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 · djdy

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

 AddDefaultCharset UTF-8
 AddCharset UTF-8 .php

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы