UTF-8 является стандартом де-факто для веб-приложений, но PHP это не стандартная кодировка для PHP (до 6.0). По умолчанию большинство серверов настроено для кодировки ISO-8859-1.
Как перегрузить настройки по умолчанию в .htaccess
чтобы убедиться, что все хорошо для UTF-8, локали и т. Д.? Любые опции для веб-сервера, Unix OS?
Есть ли исчерпывающий список этих настроек? Например, параметры mbstring
, настройки iconv
, локали и т. Д. Я должен настроить для каждого проекта с несколькими языками? Любой предварительно определенный .htaccess
в качестве примера?
(В моем конкретном случае мне нужна настройка для языков: английский, голландский и русский. Сервер находится в Украине).
Некоторые полезные параметры для .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
– хороший выбор для веб-приложений.
Кодирование представляет собой метаинформацию для данных, которые обрабатываются get. Пока вы знаете кодировку (двоичных) данных, вы знаете, с чем имеете дело. Вы начинаете заблуждаться, если не знаете кодировки. Я часто называю это цепочкой, если цепочка кодирования сломана, данные будут сломаны. Это справедливо и для отображения данных, а также для обеспечения безопасности.
Как правило, PHP двоичный, это контекст / вы указываете кодировку (например, как вы сохраняете файлы исходного кода php).
Итак, давайте рассмотрим короткий (и неполный) список:
Переменные окружения могут сообщать вам о используемом языке и кодировке. Например, файловые системы имеют свою кодировку для имен файлов и каталогов. Я не очень уверен в этом, обычно мы пытаемся назвать наши файлы на английском языке, чтобы использовать только символы в диапазоне US-ASCII
который безопасен для латинских расширенных кодировок, таких как ISO-8859-1
в вашем случае как для UTF-8
.
Просто имейте это в виду, когда вы сохраняете файлы, которые загружают ваши пользователи: просто отфильтруйте имена файлов до основных букв и пунктуации, и у вас почти не будет проблем ( az
, AZ
, 0-9
, .
, -
, _
), даже сделайте их все в нижнем регистре для визуальных целей.
Если вы чувствуете, что это ухудшает удобство использования, и файловая система не предлагает диапазон символов Unicode с UTF-8, вы можете отказаться от простых кодировок, таких как rawurlencode
(Percent-Encoding, triplet) и предлагать файлы для загрузки, разрешив это имя на диск.
Обычно вам просто нужно иметь дело с тем, что у вас есть. Начните задавать общий системный администратор или программист о кодировке символов, и большинство из них скажут вам, что они действительно не заинтересованы. Естественно, это субъективно, но если вам нужен кто-то, чтобы что-то настроить для вас, это может иметь значение.
Это просто независимо от PHP, речь идет о выходе, который ваши сценарии предоставляют для работы.
Правило большого пальца: укажите его. Если вы не указали это (файлы HTML, файлы CSS, файлы Javascript), не ожидайте, что он будет работать точно. Просто сделай это. Кодирование – это цепочка, если есть много компонентов, убедитесь, что каждый знает о ее кодировании. В противном случае браузеры могут только догадываться. UTF-8
– хороший выбор, но наша задача – позаботиться и сделать это точным и четко определенным.
Как общее правило, начните читать файл php.ini
который поставляется с пакетом PHP вашего дистрибутива linux. Он содержит читаемую документацию в комментариях и других ссылках. Некоторые настройки, которые мне приходят в голову:
default_charset
– PHP всегда выводит кодировку символов по умолчанию в заголовок Content-type :. Чтобы отключить отправку кодировки, просто установите ее пустой ( источник ). Общие сведения см. В разделе Настройка параметра кодировки HTTP W3C . Если вы хотите улучшить вывод своего сайта, например, для сохранения информации о кодировке, когда пользователи сохраняют вывод в своем браузере, добавьте метатег HTML http-equiv, а также <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
. output_handler
– Этот параметр стоит посмотреть, поскольку он указывает обработчик вывода ( Output Buffering Control Docs ), и каждый обработчик ( mb
, iconv
) может иметь собственные настройки кодировки (см. Строки ). $binary = (binary) $string;
или $binary = b"binary string";
, mb_internal_encoding()
Docs – получить или установить его; mbstring.internal_encoding
INI . Внутреннее кодирование – это имя кодировки символов, используемое для преобразования кодировки входного символа HTTP, преобразования кодировки выходного символа HTTP и кодировки символов по умолчанию для строковых функций, определенных модулем mbstring. iconv_set_encoding()
Docs – сопоставимо для расширения iconv. См. Также настройки конфигурации iconv . htmlspecialchars
Docs . Используйте эти параметры и проверьте документы для их значения по умолчанию. Часто это ISO-8859-1
но вы ищете UTF-8
. Другие функции, такие как html_entity_decode
Docs , используют UTF-8
по умолчанию. Некоторым, как htmlspecialchars_decode
вообще не указывать кодировку, поэтому вам нужно прочитать исходный код PHP для конкретного конкретного понимания того, как функция имеет дело с (двоичной) строкой. Чтобы ответить на ваш вопрос: потребность в настройках и параметрах всегда зависит от используемых вами компонентов. Для таких общих, как браузер или веб-сервер, можно настроить рекомендации для настройки 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.
Для регулярных выражений используйте 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
(на основе языка, на котором в настоящее время переключается), в кодировке используйте utf-8 вместо latin2 / iso-8859-2, и он должен хорошо работать.
Попробуйте выполнить одно из следующих действий:
AddDefaultCharset UTF-8 AddCharset UTF-8 .php