PHP, IMAP и Outlook 2010 - кодировка имен папок отличается?

Я разрабатываю почтовый клиент в php (с symfony2), и у меня проблема с папками с не-ascii символами в имени.

Папка, созданная в приложении php, правильно отображается в том же приложении. То же самое в Outlook, созданный в Outlook выглядит хорошо в Outlook. В других случаях нет. Папка, созданная в outlook, неправильно отображается в php и наоборот.

Я использую utf-7 для кодирования имен папок в php. Какая кодировка использует Outlook?

Пример: папка с именем "Wysłąne" (неправильно написанное польское слово, означающее "отправлено"), первая кодируется в utf7 с помощью php, а вторая создается в Outlook:

PHP:

Wys&xYLEhQ-ne

Перспективы:

Wys&AUIBBQ-ne

Почему это отличается? Как сделать это в той же кодировке?

1 ответ

Решение

Кажется, в вашей исходной кодировке символов произошла путаница. imap_utf7_encode (и аналогичные) ожидают вашу строку в кодировке ISO-8859-1.

УДОВОЛЬСТВИЕ: нет способа представить Wysłąne в ISO-8859-1. "Wysłąne", представленный как UTF-8, становится (шестнадцатеричные байты)

byte value (hex)    57, 79, 73, C5 82, C4 85, 6E 65
unicode character   W   y   s   ł      ą      n  e

Результат PHP Wys&xYLEhQ-ne при декодировании - "Wys ys ne". Два специальных символа - это корейские символы с кодовыми точками U+C582 и U+C485 соответственно. Таким образом, кажется, что попытка перевода от символа к символу была предпринята как-то, где представление двух символов в UTF-8 вместо этого интерпретируется как кодовые точки Unicode.

Самый простой способ исправить это - использовать mbstring расширение, которое имеет mb_convert_encoding функция.

$utf7encoded = mb_convert_encoding($utf8SourceString, "UTF7-IMAP","UTF-8")
$decodedAsUTF8 = mb_convert_encoding($utf7String,"UTF-8", "UTF7-IMAP")
Другие вопросы по тегам