PHP китайский иероглиф IMAP - PullRequest
0 голосов
/ 06 ноября 2011

Я получаю данные из электронной почты через IMAP и хочу определить (через PHP), есть ли в теле символы на китайском, японском или корейском языках программным путем.Я знаю кодировку, но нет, чтобы обнаружить

    $mbox = imap_open ("{localhost:995/pop3/ssl/novalidate-cert}",  "info@***.com", "********");

    $email=$_REQUEST['email'];

    $num_mensaje = imap_search($mbox,"FROM $email");

    // grab the body for the same message
        $body =  imap_fetchbody($mbox,$num_mensaje[0],"1");

            //chinese for example
        $str = mb_convert_encoding($body,"UTF-8","EUC-CN");

    imap_close($mbox);

Любая идея

1 Ответ

2 голосов
/ 06 ноября 2011
  • Вы имеете в виду, что не знаете, в каком CJK кодируется входящее сообщение?

Каноническим местом для поиска этой информации является параметр charset= в заголовке Content-Type:.

К сожалению, извлечь это не так просто, как можно было бы надеяться. На самом деле вы могли бы подумать, что объект, возвращаемый imap_header, будет содержать информацию о типе, но это не так. Вместо этого вы должны использовать imap_fetchheader, чтобы извлечь необработанные заголовки из сообщения и проанализировать их самостоятельно.

Разбор заголовков RFC822 не совсем прост. Для простых случаев вы можете избежать совпадения каждой строки с ^content-type:.*; *charset=([^;]+) (без учета регистра). Но для того, чтобы сделать это действительно правильно, вам нужно будет запустить все заголовки и тело сообщения через правильный синтаксический анализатор семейства RFC822, такой как MailParse .

И тогда у вас все еще есть проблема с сообщениями, которые не включают charset информацию. Для этого случая вам нужно будет использовать mb_detect_encoding.

  • Или вы просто беспокоитесь о том, на каком языке отображаются правильно декодированные символы?

В этом случае заголовок, который вы хотите прочитать, используя тот же метод, что и выше, это Content-Language. Однако это очень часто не присутствует, и в этом случае вы должны вернуться к угадыванию снова. Унификация CJK означает, что все языки могут использовать много одинаковых символов, но есть несколько эвристик, которые можно использовать, чтобы угадать:

  1. Кодировка, в которой было сообщение, из приведенного выше. например, если это был EUC-CN, скорее всего, ваши языки будут упрощенными китайскими.

  2. Наличие в тексте любого кана (U + 3040 – U + 30FF -> японский) или хангыль (U + AC00 – U + D7FF -> корейский).

  3. Наличие упрощенных и традиционных китайских символов. Хотя некоторые символы могут представлять оба, другие (где есть существенное изменение штрихов между этими двумя вариантами) только один. Простой способ обнаружить их присутствие - попытаться закодировать строку в кодировки GBK и Big5 и посмотреть, не сработает ли она. то есть, если вы не можете кодировать в GBK, но можете в Big5, это будет традиционный китайский.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...