NewVision WEB-development Team Blog

http input/output character conversion

Недавно решал проблему, ради которой пришлось вспоминать цепочку передачи данных по http протоколу от клиента к серверу и какие преобразования могут с ними происходить.

У нас есть некая клиент-серверная система. Упрощенно ее можно представить как пхп-скрипт, лежащий на сервере и пхп-скрипты, которые раскиданы по разным хостингам. Сервер методом POST шлет данные клиентам, те отрабатывают и возвращают результат. Данные могут содержать русские символы.
Проблема была в том, что на одном из хостингов, в клиентский скрипт русские символы в запросе приходили в виде вопросиков. Т.е. в массиве $_POST в место русских символов были символы вопроса.

Выяснилось, что если установлено расширение mbstring, то можно включить так называемое автоматическое http input/output перекодирование данных. Т.е. данные проходят через «фильтр», который пытается автоматом определить их кодировку и перекодировать в utf-8. На проблемном хостинге это преобразование почему-то проходило неправильно.
Т.к. мы шлем и принимаем данные клиенту в utf-8, то просто отключили автоматическую перекодировку. Для этого можно в папке на хостинге, в которой лежит клиентский скрипт, создать файл .htaccess и переопределить настройки php

php_value mbstring.encoding_translation off
php_value mbstring.http_input pass
php_value mbstring.http_output pass

Кстати, при написании скрипта, который должен работать на разных хостингах стоит также учитывать настройки magic quotes, они могут здорово подпортить жизнь.
Как было сказано выше, подобные настройки можно переопределить в файле .htaccess (если это конечно разрешено в настройках Apache).
Вот так выглядит наш файл .htaccess:

php_value mbstring.language Neutral
php_value mbstring.internal_encoding UTF-8
php_value mbstring.encoding_translation off
php_value mbstring.http_input pass
php_value mbstring.http_output pass
php_value mbstring.detect_order auto
php_value mbstring.substitute_character none
php_value default_charset UTF-8

php_value magic_quotes_gpc Off
php_value magic_quotes_runtime Off
php_value magic_quotes_sybase Off

События напомнили статью Джоэля Сполски: Закон Дырявых Абстракций. Фреймверки построили для нас целые абстракции для работы с web, базами данных, сессиями пользователей и т.п. Порой уже начинаешь забывать что происходит под этой прослойкой… ну, … конечно не надолго…

2 Комментариев

max  on Март 19th, 2010

php_value magic_quotes_runtime Of_F_ – надо ьы поправить – а то кто-то скопирует и получит сервер мисконфигурейшн

Ruslan Kovalenko  on Март 20th, 2010

Подправили, спасибо max. Глаз – алмаз ;)

Оставить комментарий