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")