Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Кодирование национальных символов в 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-');