Intereting Posts
Как связать функции вызова, используя строку, содержащую эту цепочку в PHP Получение содержимого DIV с помощью регулярного выражения Woocommerce – необходимо отправить электронное письмо по определенному адресу на основе почтового индекса Загрузка файла в Codeigniter Являются ли конструкторы абстрактного класса неявным образом вызваны при создании экземпляра производного класса? Обрезаемая фатальная ошибка: объект класса PDOStatement не может быть преобразован в строку в /home/refined/public_html/refer.php в строке 30 Выполнить сценарий оболочки в фоновом режиме, пока страница отображается на экране пользователю в php Codeigniter 3.x Вход с подтверждением формы – Пластина Компилировать регулярное выражение в PHP PHP file_exists () для URL / robots.txt возвращает false Javascript и PHP Xor эквивалент Оценить перенаправление PHP 404, связанное с неверным запросом на получение TypeError: oColumn не определено При использовании библиотеки JQuery Datatables WordPress wp-load.php Поле пользовательских форм Symfony2

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

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) и предлагать файлы для загрузки, разрешив это имя на диск.

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

HTML

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

  • Обработка кодировок символов в HTML и CSS

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

Настройки PHP

Как общее правило, начните читать файл 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 ) может иметь собственные настройки кодировки (см. Строки ).

Струны

  • Строковые документы. По умолчанию строки в PHP являются двоичными. Пока вы используете их с бинарными безопасными функциями, вы получаете то, что ожидаете. Начиная с PHP 5.2.1 вы можете явно передавать строки в двоичные строки . Это для прямой совместимости указанной поддержки PHP 6: $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 . Но со всем остальным это зависит. Самое главное – это найти его и убедиться, что вы знаете кодировку и можете ее настроить / указать. Часто это документировано. До тех пор, пока вам не нужно иметь дело с переносным кодом, это намного проще, поскольку вы контролируете среду или вам нужно иметь дело только с определенной средой. Напиши код в обороне с учетом кодировки, и все должно быть в порядке.

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

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

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