2013-06-19 2 views
1

Я использую PHP imap для чтения электронных писем из папки «Входящие». Он извлекает некоторую информацию из заголовков. Один из заголовков выглядит следующим образом:Декодирование кодированного заголовка UTF-8

X-My-Выборочная-заголовок: = UTF-8 B RXVnZW4gQmFiacSH =

Исходное значение этой закодированной строки является Eugen Бабич??.

Когда я пытаюсь декодировать эту строку с помощью PHP, я не могу понять ее правильно, она всегда возвращается в исходное состояние.

Я пробовал imap_utf8, imap_mime_header_decode и кучу других, которых я не могу вспомнить. Они либо ничего не возвращают, либо испортили, как я уже упоминал ранее.

Каков правильный способ его декодирования?

+0

Как это акцентированный с вошел в закодированной строке? –

+0

Можете ли вы подробнее рассказать? Я не уверен, что вы подразумеваете под «введенным в свою закодированную строку». Я сам не кодировал строку, я предполагаю, что это было сделано любым отправленным электронным письмом. –

+0

Извините, что я имел в виду, как первоначально был введен акцентированный c? Согласно wikipedia: код Unicode U + 0107 для ć. Был ли он введен с использованием этого кода, был ли он введен с помощью ярлыка Microsoft Word (к ним всегда относятся плохо другие программы), было ли оно введено с помощью клавиши на клавиатуре польского языка? –

ответ

1

Вот что вы делаете неправильно: вы HTML (как сгенерированный PHP) не кодируется UTF-8. Поэтому, несмотря на то, что он возвращает акцентированный c, страница не отображает его правильно.

Чтобы исправить это, добавьте это в <head> теге:

<meta http-equiv='Content-Type' content='text/html; charset=utf-8'> 
+0

Отправка кодировки в HTTP-заголовке Content-Type предпочтительнее использования метатега. – Joni

2

imap_utf8 и imap_mime_header_decode Работает нормально; есть также iconv_mime_decode:

php > echo imap_utf8('X-My-Custom-Header: =?UTF-8?B?RXVnZW4gQmFiacSH?='), "\n"; 
X-My-Custom-Header: Eugen Babić 

php > list($k,$v) = imap_mime_header_decode('X-My-Custom-Header: =?UTF-8?B?RXVnZW4gQmFiacSH?='); 
php > echo $v->text, "\n"; 
Eugen Babić 

php > echo iconv_mime_decode('X-My-Custom-Header: =?UTF-8?B?RXVnZW4gQmFiacSH?=', 0, "utf8"), "\n"; 
X-My-Custom-Header: Eugen Babić 

Кажется, что imap_utf8 возвращает свой выход в NFD, так что акцент над с может показаться неуместным в некоторых ситуациях.

+0

Я собрал небольшой скрипт на сервере, чтобы вы могли видеть результат (я скопировал ваши точные примеры): http://cameronsflash.com/misc/test.php, как вы можете видеть, акцент на c неправильно в каждом случае: \ –

+0

Выглядит хорошо для меня, в каждом случае. Единственное, что вы могли бы сделать, это указать кодировку в заголовке Content-Type: '(Content-Type: text/html; charset = utf-8 ')'. В настоящее время у вас есть значение text/html, что означает, что браузер должен угадать. Ваш браузер должен ошибаться. – Joni

0

Функция mb_decode_mimeheader() решена проблема

  "fromName" => (isset($fromInfo->personal)) 
       ? mb_decode_mimeheader($fromInfo->personal) : "",