Кодирование национальных символов в Cyrus IMAP
На днях пришлось столкнуться с кодированием русских символов в папках сервера Cyrus IMAP. Выглядит это примерно так:
folder.BC8EPQQ0BDUEOgRBBDAALQRBBDUEOgRABDUEQg-
Мне повезло, я догадался, что это модифицированная UTF-7, после раскодировки оказалось, что раскодированный текст находится в кодироке UCS-2 big endian. Получилась вот такая функция для перевода всего этого безобразия в UTF-8:
// 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-');