Эксперименты с UTF-8
by Евгений Викторович Арбатский - В рамках разработки модуля синхронизации данных по преподавателям с Novell решил опробовать все это под UTF-8. Это сразу позволило отказаться от конвертации Novell-овских данных в CP1251. Следует отметить, что в Novell-овской NDS данные уже много лет хранятся именно в UTF-8. Для SOAP иземение коснулось лишь строки создания клиента и указания кодировки:
В скрипте для надежности рекомендую добавить конструкцию вида:
При включенном режиме override функции substr, strlen и т.п. будут автоматически заменяться на их аналоги mb_substr, mb_strlen...
Так же следует обязательно в настройках php.ini указать внутреннюю кодировку, иначе функции все же будут работать не совсем корректно.
Кусок настроек из php.ini:
К сожалению, пока нельзя включить такие настройки глобально на рабочих серверах, так как это может негативно сказаться на непроверенных скриптах.
$client =new SoapClient(null,array('location'=> "http://localhost/soap.php", 'uri' => "http://localhost/soap.php", 'encoding' => "UTF-8"))С обработкой же строк сразу возникли проблемы, так как прежние функции вида strlen, substr начинают выдавать не то, что надо. Но в PHP для этого есть чудесная возможность включить обработку мультибайтных строк с помощью настроек. Единственный минус заключается в том, что это нельзя сделать локально в скрипте :( То есть надо либо прописать все в php.ini, либо в конфигах Apache (или htaccess).
В скрипте для надежности рекомендую добавить конструкцию вида:
if(ini_get("mbstring.func_overload") >= 2)
{
// Работа с UTF8 включилась
}
else
{
print("ERROR!!! Can't override string functions for UTF8.\n"); exit();
}
При включенном режиме override функции substr, strlen и т.п. будут автоматически заменяться на их аналоги mb_substr, mb_strlen...
Так же следует обязательно в настройках php.ini указать внутреннюю кодировку, иначе функции все же будут работать не совсем корректно.
Кусок настроек из php.ini:
[mbstring]
; language for internal character representation.
; Кодировку написал наугад, возможно надо по-другому, но работает
mbstring.language = Russian
; internal/script encoding.
mbstring.internal_encoding = UTF-8
; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
mbstring.func_overload = 2
К сожалению, пока нельзя включить такие настройки глобально на рабочих серверах, так как это может негативно сказаться на непроверенных скриптах.
SOAP с UTF-8
by Евгений Викторович Арбатский - За последний год уже привык работать с UTF-8, но проблемы все равно периодически вылазят. Например, одна из последних:
В PHP есть несколько вариантов создания SOAP-серверов (родной php-soap, PEAR:SOAP, nusoap), но только в одном я нашел возможность полуавтоматически создавать wsdl - в nusoap. К сожалению, развитие nusoap остановилось на уровне 2007-го года, а поддержка UTF-8 там ограниченная, и вот вчера я столкнулся с тем, что не получается из сервера с UTF-8 передать корректно русский текст клиенту с UTF-8 (кстати, вот еще одна проблема с русскими кодировками). Но с CP1251 nusoap работает чудесно, в частности, у нас нормально данные передаются из 1С в ЕБД.
Причем родной php-soap работает корректно с UTF-8, но в нем нет нормальной реализации создания wsdl описаний (а создавать их ручками нет никакого интереса).
Вот такие вот интересности - и там не так, и так не эдак. Приходится постоянно идти на компромис в технических решениях. Либо менять язык для создания сервисов.
В PHP есть несколько вариантов создания SOAP-серверов (родной php-soap, PEAR:SOAP, nusoap), но только в одном я нашел возможность полуавтоматически создавать wsdl - в nusoap. К сожалению, развитие nusoap остановилось на уровне 2007-го года, а поддержка UTF-8 там ограниченная, и вот вчера я столкнулся с тем, что не получается из сервера с UTF-8 передать корректно русский текст клиенту с UTF-8 (кстати, вот еще одна проблема с русскими кодировками). Но с CP1251 nusoap работает чудесно, в частности, у нас нормально данные передаются из 1С в ЕБД.
Причем родной php-soap работает корректно с UTF-8, но в нем нет нормальной реализации создания wsdl описаний (а создавать их ручками нет никакого интереса).
Вот такие вот интересности - и там не так, и так не эдак. Приходится постоянно идти на компромис в технических решениях. Либо менять язык для создания сервисов.