imap_mime_header_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mime_header_decode解码 MIME 头部元素

描述

imap_mime_header_decode(string $string): array|false

解码 MIME 消息头扩展,这些扩展是非 ASCII 文本(参见 » RFC2047)。

参数

string

MIME 文本

返回值

解码后的元素以对象数组的形式返回,每个对象具有两个属性,charsettext

如果元素没有被编码,换句话说,它是纯 US-ASCII,则该元素的 charset 属性被设置为 default

如果失败,该函数将返回 false

示例

示例 #1 imap_mime_header_decode() 示例

<?php
$text
= "=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <[email protected]>";

$elements = imap_mime_header_decode($text);
for (
$i=0; $i<count($elements); $i++) {
echo
"Charset: {$elements[$i]->charset}\n";
echo
"Text: {$elements[$i]->text}\n\n";
}
?>

上面的示例将输出

Charset: ISO-8859-1
Text: Keld Jørn Simonsen

Charset: default
Text:  <[email protected]>

在上面的示例中,我们将有两个元素,第一个元素之前用 ISO-8859-1 编码,而第二个元素将是纯 US-ASCII。

参见

  • imap_utf8() - 将 MIME 编码的文本转换为 UTF-8

添加笔记

用户贡献笔记 13 条笔记

9
匿名
11 年前
解码字符串的一种好方法是使用 mb_list_encodings(),但我遇到了两个问题
有时,字符集在头文件中是使用大写,而在 mb_list_encodings() 中是使用小写,有时字符集不在 mb_list_encodings() 列表中。

<?php
function upperListEncode() { // 将 mb_list_encodings() 转换为大写
$encodes=mb_list_encodings();
foreach (
$encodes as $encode) $tencode[]=strtoupper($encode);
return
$tencode;
}

function
decode($string) {
$tabChaine=imap_mime_header_decode($string);
$texte='';
for (
$i=0; $i<count($tabChaine); $i++) {

switch (
strtoupper($tabChaine[$i]->charset)) { // 将字符集转换为大写
case 'UTF-8': $texte.= $tabChaine[$i]->text; // utf8 正常
break;
case
'DEFAULT': $texte.= $tabChaine[$i]->text; // 不转换
break;
default: if (
in_array(strtoupper($tabChaine[$i]->charset),upperListEncode())) // 在 mb_list_encodings() 中找到
{$texte.= mb_convert_encoding($tabChaine[$i]->text,'UTF-8',$tabChaine[$i]->charset);}
else {
// 尝试使用 iconv() 转换
$ret = iconv($tabChaine[$i]->charset, "UTF-8", $tabChaine[$i]->text);
if (!
$ret) $texte.=$tabChaine[$i]->text; // 发生错误(未知字符集)
else $texte.=$ret;
}
break;
}
}

return
$texte;
}
?>
2
cracker at bigcracker dot ca
19 年前
回复 Sven dot Dickert at planb dot de:如果您遇到 "=?utf-8?Q?" 出现在头文件中的问题,我发现只需使用 "imap_utf8($string)" 就可以正确地解码 "$string" 并完美地解决了我的问题。
1
mattias at forss dot se
20 年前
此函数不会像 bandpay at hotmail dot com 发布的函数那样对 a-z 0-9 进行编码

function encode_iso88591($string) {
if( ereg("[^A-Za-z0-9\ ]", $string) ) {
$text = "=?iso-8859-1?q?";
for( $i = 0 ; $i < strlen($string) ; $i++ ) {
if( ereg("[^A-Za-z0-9]", $string[$i]) ) {
$text .= "=".dechex(ord($string[$i]));
} else {
$text .= $string[$i];
}
}
return $text."?=";
} else return $string;
}
0
paolo dot ceccacci at gmail dot com
9 年前
这是一个将 UTF-8 转换为 iso-8859-1 的 "flatMimeDecode" 版本

function flatMimeDecode($string) {
$array = imap_mime_header_decode ($string);
$str = "";
foreach ($array as $key => $part) {
if($part->charset == "UTF-8"){
$str .= utf8_decode ($part->text);
}else{
$str .= $part->text;
}
}
return $str;
}
0
kai at froghh dot de
16 年前
注意包含空格的多行主题,这些空格本身不属于主题,而是作为功能字符用于客户端。

例如,您可能在邮件头中包含以下内容
Subject: =?iso-8859-1?Q?WG=3A_Mobilit=E4t_verschlechtert_--=3E_174?=
=?iso-8859-1?Q?6?=

(回车符和制表符)。
imap_mime_header_decode 返回 5 部分(而不是预期的 2 部分)
对于这个示例。
- 第一部分包含 "subject:" 和主题本身之间的空格。
- 第二部分是第一个编码文本
- 第三部分将是头行中的换行符。
它们被插入以保持符合 RFC 的行长度,并且不是发件人输入的原始主题的一部分。
- 第四部分将是主题的第二部分。
- 第五个是换行符 - 任何时候其他标题或邮件正文都将跟随,最后一个字符将是一个换行符,因此它在标题中是必要的 - 但不是原始主题的一部分。
0
diego nunes <dn at nospam dot dnunes dot com>
17 年前
之前的评论(来自 hans)似乎毫无意义,因为它不会改变编码,并且可能导致“多编码”字符串(当然,浏览器和其他任何东西都无法呈现)。

我使用一个小函数将整个标题解码为指定的编码。它如下

<?php
// 返回支持的编码(小写)。
function mb_list_lowerencodings() { $r=mb_list_encodings();
for (
$n=sizeOf($r); $n--; ) { $r[$n]=strtolower($r[$n]); } return $r;
}

// 接收一个包含邮件头的字符串,并将其
// 解码为指定的字符集。
// 如果邮件头中指定的字符集
// 不被“mb”支持,则将使用“fallbackCharset”
// 尝试对其进行解码。
function decodeMimeString($mimeStr, $inputCharset='utf-8', $targetCharset='utf-8', $fallbackCharset='iso-8859-1') {
$encodings=mb_list_lowerencodings();
$inputCharset=strtolower($inputCharset);
$targetCharset=strtolower($targetCharset);
$fallbackCharset=strtolower($fallbackCharset);

$decodedStr='';
$mimeStrs=imap_mime_header_decode($mimeStr);
for (
$n=sizeOf($mimeStrs), $i=0; $i<$n; $i++) {
$mimeStr=$mimeStrs[$i];
$mimeStr->charset=strtolower($mimeStr->charset);
if ((
$mimeStr == 'default' && $inputCharset == $targetCharset)
||
$mimStr->charset == $targetCharset) {
$decodedStr.=$mimStr->text;
} else {
$decodedStr.=mb_convert_encoding(
$mimeStr->text, $targetCharset,
(
in_array($mimeStr->charset, $encodings) ?
$mimeStr->charset : $fallbackCharset)
)
);
}
} return
$decodedStr;
}
?>

希望它能有所帮助。
-2
hdlim at kis21 dot com
21 年前
imap_mime_header_decode、utf-7 和 utf-8 问题,我使用以下函数解决了问题。注意,iconv 函数用于代码转换。
您必须将“EUC-KR”替换为 iconv 参数,使用您想要的字符集,例如“iso-8859-1”。

function mime_decode($s) {
$elements = imap_mime_header_decode($s);
for($i = 0;$i < count($elements);$i++) {
$charset = $elements[$i]->charset;
$text =$elements[$i]->text;
if(!strcasecmp($charset, "utf-8") ||
!strcasecmp($charset, "utf-7"))
{
$text = iconv($charset, "EUC-KR", $text);
}
$decoded = $decoded . $text;
}
return $decoded;
}
-2
Sven dot Dickert at planb dot de
22 年前
注意!4.0.6 中的 imap_mime_header_decode _不_符合 RFC2047。字符串 =?utf-7?Q?Petra_M+APw-ller?= 不会被转换为 Petra Müller,因为字符集 utf7 是未知的。对于字符集 utf8,=?utf-8?Q?Petra_M=C3=BCller?= 也是如此。
-1
s dot wiese at trabia dot md
16 年前
diego 的示例运行良好,他在代码中有一个(非常)小的
错误。以下是更正后的版本

<?php
// 返回支持的编码(小写)。
function mb_list_lowerencodings() { $r=mb_list_encodings();
for (
$n=sizeOf($r); $n--; ) { $r[$n]=strtolower($r[$n]); } return $r;
}

// 接收一个包含邮件头的字符串,并将其
// 解码为指定的字符集。
// 如果邮件头中指定的字符集
// 不被“mb”支持,则将使用“fallbackCharset”
// 尝试对其进行解码。
function decodeMimeString($mimeStr, $inputCharset='utf-8', $targetCharset='utf-8', $fallbackCharset='iso-8859-1') {
$encodings=mb_list_lowerencodings();
$inputCharset=strtolower($inputCharset);
$targetCharset=strtolower($targetCharset);
$fallbackCharset=strtolower($fallbackCharset);

$decodedStr='';
$mimeStrs=imap_mime_header_decode($mimeStr);
for (
$n=sizeOf($mimeStrs), $i=0; $i<$n; $i++) {
$mimeStr=$mimeStrs[$i];
$mimeStr->charset=strtolower($mimeStr->charset);
if ((
$mimeStr == 'default' && $inputCharset == $targetCharset)
||
$mimStr->charset == $targetCharset) {
$decodedStr.=$mimStr->text;
} else {
$decodedStr.=mb_convert_encoding(
$mimeStr->text, $targetCharset,
(
in_array($mimeStr->charset, $encodings) ?
$mimeStr->charset : $fallbackCharset)
)
);
}
} return
$decodedStr;
}
?>
-1
charsyam at liso dot cs dot pusan dot ac dot kr
23 年前
我写了一个简单的 ks_c_5601-1987(2 字节)
编码

function encode_ksc5601( $string )
{
$encode = base64_encode( $string );
$text = "=?ks_c_5601-1987?B?";
$text = $text.$encode."?=";
return $text;
}
-1
Pawel Tomicki <pafka at klub dot chip dot pl>
20 年前
<?php

function decode_iso88591($string){
if (
strpos(strtolower($string), '=?iso-8859-1') === false) {
return
$string;
}
$string = explode('?', $string);
return
strtolower($string[2]) == 'q' ? quoted_printable_decode($string[3]) : base64_decode($string[3]);
}

?>
-3
alchrystal88 at web dot de
5 年前
如果您遇到以下错误,附件名称错误

正确名称
字符串 -> Prüfbericht Hersteller.pdf

fetchstructure 对象名称
=?ISO-8859-1?Q?Pr=FCfbericht_Hersteller=2Epdf?=

解决方法,重新转换

imap_mime_header_decode($fetchstructure->dparameters->value)[0]->text

imap_mime_header_decode($filename)[0]->text
-4
hans at lintoo dot dk
18 年前
这很明显,但无论如何这里有一个“扁平”版本
<?php
private function flatMimeDecode($string) {
$array = imap_mime_header_decode($string);
$str = "";
foreach (
$array as $key => $part) {
$str .= $part->text;
}
return
$str;
}
?>
To Top