Евгений Степанищев

Эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

WDDX в PHP и русские символы

У меня ощущение, что никто никогда не пробовал гонять национальные символы через WDDX из PHP в другие языки и обратно. Задача: получить от демона Perl сериализованные данные и десериализовать их. Был выбран формат WDDX, вроде как хорошо описанный стандарт и всё такое. JSON сначала не подошёл, модуль в Perl что-то там дурил, теперь мы это победили. Тем временем в WDDX…

Всё было хорошо, пока в utf8-потоке от Perl не появились символы, которые не влезают в нижнюю половину ASCII. Я перебрал автоматом все кодировки, которые знает iconv, чтобы посмотреть в какой кодировке PHP WDDX умеет есть русские буквы. Ничего ему не понравилось. Потом я догадался сериализовать utf-8 символ через функцию из PHP. Получилось что-то странное. Залез в исходники.

В общем, оказалось, что какое-то время назад кто-то постил баг по этому поводу — UTF-8 в WDDX не передавались вообще. Решили проблему очень просто — взяли кодировку как однобайтовую ISO-8859-1, закодировали в utf-8 и в таком виде выпустили в свет. При получении делается обратное преобразование:
if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) {
    char *decoded;
    int decoded_len;
    decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");
    stack->varname = decoded;
    break;
}
Соответственно, когда PHP получает из Perl нормальный UTF-8, он его пытается рассмотреть как UTF-8, который надо превратить в ISO-8859-1, на выходе мы получаем вопросы. Чтобы этого не происходило перед wddx_deserialize надо сделать iconv('iso-8859-1', 'utf-8', $string), что решает проблему.

В итоге, мы перешли на JSON. Всем хорошего дня.
25 июня 2008 17:13

coprophagous.ru (coprophagous.ru)
25 июня 2008, 18:48

А как это помогает при продвижении сайта в Яндексе, я не понял?

bolk (bolknote.ru)
25 июня 2008, 19:25, ответ предназначен coprophagous.ru:

Ага, ты не понял.

Owner (companyowner.myopenid.com)
26 июня 2008, 00:51

Мне вот что интересно - а это под NDA разве не попадает, фактически ты выносишь знания наружу :) Или в yandex ничего такого нет?!

coprophagous.ru (coprophagous.ru)
26 июня 2008, 02:36, ответ предназначен Owner (companyowner.myopenid.com):

Наоборот - такими вещами принято делиться в приличном обществе.

Под NDA попадают совсем другие вещи. Например, планы.

Owner (companyowner.myopenid.com)
26 июня 2008, 07:05

Один из классических NDA, которые мои ребята подписывали (почти все одно и тоже содержут):

I hereby assign to the Company all my rights in and to all inventions, discoveries, improvements, designs, know-how, technical or commercial information, computer programs in any form, written materials, data bases, integrated circuit topologies, plans, diagrams, drawings, models, and other things, which I may conceive, develop or reduce to practice during the period of my services with the Company and which:

bolk (bolknote.ru)
26 июня 2008, 10:32, ответ предназначен Owner (companyowner.myopenid.com):

В «Яндексе» всё куда разумнее. Это не NDA, конечно же.

coprophagous.ru (coprophagous.ru)
26 июня 2008, 14:50, ответ предназначен Owner (companyowner.myopenid.com):

NDA в яндексе имеет формулировку "не пиздеть лишнего".

True story.

dt.livejournal.com (dt.livejournal.com)
26 июня 2008, 15:29

"Не пиздеть до официального прессрелиза", даже так :)

mrgatsby.livejournal.com (mrgatsby.livejournal.com)
26 июня 2008, 16:21

NDA в Яндексе - это Кукуц. Если он говорит "товарищи, у нас посторонние" - значит всё, паливо.

bolk (bolknote.ru)
26 июня 2008, 22:27, ответ предназначен coprophagous.ru:

NDA в «Яндексе» — вполне конкретная бумажка. А устные указания примерно такие, да.

bolk (bolknote.ru)
26 июня 2008, 22:32, ответ предназначен dt.livejournal.com:

Да и после тоже. Есть специальные люди, обученные правильно пиздеть.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)

Подсказка по написанию комментария

В комментариях можно применять следующую специальную разметку:

  • слово, обрамлённое в «звёздочки» выделяется *жирным*
  • ссылка становится ссылкой: http://bolknote.ru
  • ссылка в скобках также становится ссылкой, закрывающая скобка не захватывается: (http://bolknote.ru)
  • каждую строку цитаты следует начинать со знака «больше»:
    > это цитата
    > из двух строк
  • можно вставить картинку, залитую на один из сервисов: «Яндекс.Фотки», «Фликр» или «Пикплз». Для этого нужно вставить на страницу полный адрес вашей картинки на сервисе, он превратится в картинку:

    http://fotki.yandex.ru/users/bolknote/view/274311?page=3