UTF-8 теперь является стандартом де-факто для веб-приложений, но PHP это не кодировка по умолчанию для PHP (до версии 6.0). Большая часть сервера настроена на кодировку ISO-8859-1 по умолчанию.
Как перегрузить настройки по умолчанию в .htaccess, чтобы быть уверенным, что все идет хорошо для UTF-8, локали и т. д.? Любые варианты для веб-сервера, ОС Unix?
Есть ли полный список этих настроек? Например. mbstring параметры, iconv настройки, локаль и т. д., которые я должен настроить для каждого многоязычного проекта? Какой-нибудь предопределенный .htaccess в качестве примера?
(В моем конкретном случае мне нужна настройка для языков: английский, голландский и русский. Сервер находится в Украине).
Ответ 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. Он поставляется с читаемой документацией в комментариях и дополнительных ссылках. Некоторые настройки, которые приходят мне на ум:
Струны
- СтрокиДокументы em> - по умолчанию строки в PHP являются двоичными. Пока вы используете их с функциями binary safe, вы получаете то, что ожидаете. Начиная с PHP 5.2.1 вы можете приводить строки явно в двоичные строки. Это для прямой совместимости указанной поддержки юникода PHP 6:
$binary = (binary) $string; или $binary = b"binary string";.
mb_internal_encoding()Документы em> - получить или установить; mbstring.internal_encodingINIсуп>а>. Внутренняя кодировка - это имя кодировки символов, используемое для преобразования кодировки символов ввода HTTP, преобразования кодировки символов вывода HTTP и кодировки символов по умолчанию для строковых функций, определенных модулем mbstring.
iconv_set_encoding()Документы - Сопоставимо с расширением iconv. См. также настройки конфигурации iconv.
- Разное. Некоторые функции, работающие с последовательностями символов, позволяют указать кодировку набора символов. Например,
htmlspecialcharsДокументы. Используйте эти параметры и проверьте в документации их значения по умолчанию. Часто это ISO-8859-1, но вы ищете UTF-8. Другие функции, такие как html_entity_decodeДокументы. используют UTF-8 по умолчанию. Некоторые, такие как htmlspecialchars_decode, вообще не указывают кодировку, поэтому необходимо a-z3/ext/standard/html.c#1316" rel="noreferrer">прочитать исходный код PHP для конкретное конкретное понимание того, как функция работает с (двоичной) строкой.
Чтобы ответить на ваш вопрос: Необходимость настроек и параметров всегда зависит от используемых вами компонентов. Для общих, таких как браузер или веб-сервер, можно указать рекомендуемые настройки, чтобы настроить его для 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, и это должно работать хорошо.