- Вы имеете в виду, что не знаете, в каком CJK кодируется входящее сообщение?
Каноническим местом для поиска этой информации является параметр charset=
в заголовке Content-Type:
.
К сожалению, извлечь это не так просто, как можно было бы надеяться. На самом деле вы могли бы подумать, что объект, возвращаемый imap_header
, будет содержать информацию о типе, но это не так. Вместо этого вы должны использовать imap_fetchheader
, чтобы извлечь необработанные заголовки из сообщения и проанализировать их самостоятельно.
Разбор заголовков RFC822 не совсем прост. Для простых случаев вы можете избежать совпадения каждой строки с ^content-type:.*; *charset=([^;]+)
(без учета регистра). Но для того, чтобы сделать это действительно правильно, вам нужно будет запустить все заголовки и тело сообщения через правильный синтаксический анализатор семейства RFC822, такой как MailParse .
И тогда у вас все еще есть проблема с сообщениями, которые не включают charset
информацию. Для этого случая вам нужно будет использовать mb_detect_encoding
.
- Или вы просто беспокоитесь о том, на каком языке отображаются правильно декодированные символы?
В этом случае заголовок, который вы хотите прочитать, используя тот же метод, что и выше, это Content-Language
. Однако это очень часто не присутствует, и в этом случае вы должны вернуться к угадыванию снова. Унификация CJK означает, что все языки могут использовать много одинаковых символов, но есть несколько эвристик, которые можно использовать, чтобы угадать:
Кодировка, в которой было сообщение, из приведенного выше. например, если это был EUC-CN, скорее всего, ваши языки будут упрощенными китайскими.
Наличие в тексте любого кана (U + 3040 – U + 30FF -> японский) или хангыль (U + AC00 – U + D7FF -> корейский).
Наличие упрощенных и традиционных китайских символов. Хотя некоторые символы могут представлять оба, другие (где есть существенное изменение штрихов между этими двумя вариантами) только один. Простой способ обнаружить их присутствие - попытаться закодировать строку в кодировки GBK и Big5 и посмотреть, не сработает ли она. то есть, если вы не можете кодировать в GBK, но можете в Big5, это будет традиционный китайский.