Кодирование национальных символов в Cyrus IMAP
На днях пришлось столкнуться с кодированием русских символов в папках сервера Cyrus IMAP. Выглядит это примерно так:
folder.BC8EPQQ0BDUEOgRBBDAALQRBBDUEOgRABDUEQg-
Мне повезло, я догадался, что это модифицированная
// Cyrus IMAP modified UTF-7 decode
function decodeCyrus($str)
{
return preg_replace_callback('!&([a-z0-9+/=,]*)-!is', 'decodeCyrusHelper', $str);
}
function decodeCyrusHelper($m)
{
if ($m[1] == '') return '&';
return iconv('ucs-2be', 'utf-8', str_replace(',', '/', base64_decode($m[1])));
}Способ использования:
<?php
$decoded = decodeCyrus('folder.BC8EPQQ0BDUEOgRBBDAALQRBBDUEOgRABDUEQg-');WDDX в PHP и русские символы
У меня ощущение, что никто никогда не пробовал гонять национальные символы через WDDX из PHP в другие языки и обратно. Задача: получить от демона Perl сериализованные данные и десериализовать их. Был выбран формат WDDX, вроде как хорошо описанный стандарт и всё такое. JSON сначала не подошёл, модуль в Perl
Всё было хорошо, пока
В общем, оказалось, что
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 нормальный
В итоге, мы перешли на JSON. Всем хорошего дня.