iconv_mime_encode

(PHP 5, PHP 7, PHP 8)

iconv_mime_encode组合一个 MIME 头部字段

说明

iconv_mime_encode(string $field_name, string $field_value, array $options = []): string|false

组合并返回一个表示有效 MIME 头部字段的字符串,它看起来像这样

Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile
在上面的例子中,"Subject" 是字段名称,以 "=?ISO-8859-1?..." 开头的部分是字段值。

参数

field_name

字段名称。

field_value

字段值。

options

可以通过指定一个包含配置项的关联数组来控制 iconv_mime_encode() 的行为,该数组作为可选的第三个参数 options 传递。 iconv_mime_encode() 支持的项列在下面。注意,项名称区分大小写。

iconv_mime_encode() 支持的配置项
类型 说明 默认值 示例
scheme string 指定用于对字段值进行编码的方法。此项的值可以是 "B" 或 "Q",其中 "B" 代表 base64 编码方案,"Q" 代表 quoted-printable 编码方案。 B B
input-charset string 指定第一个参数 field_name 和第二个参数 field_value 所使用的字符集。如果未给出,iconv_mime_encode() 假设这些参数是以 iconv.internal_encoding ini 设置中指定的字符集传递给它的。 iconv.internal_encoding ISO-8859-1
output-charset string 指定用于组合 MIME 头部的字符集。 iconv.internal_encoding UTF-8
line-length int 指定头部行的最大长度。如果生成的头部字段长度超过此参数的值,则根据 » RFC2822 - Internet Message Format 将生成的头部“折行”成多行。如果未给出,长度将限制为 76 个字符。 76 996
line-break-chars string 指定在对长头部字段执行“折行”时,追加到每行末尾的字符序列,作为行尾符。如果未给出,则默认值为 "\r\n" (CR LF)。注意,无论 input-charset 的值如何,此参数始终被视为 ASCII 字符串。 \r\n \n

返回值

如果成功,返回编码的 MIME 字段,如果在编码过程中发生错误,则返回 false

示例

示例 #1 iconv_mime_encode() 示例

<?php
$preferences
= array(
"input-charset" => "ISO-8859-1",
"output-charset" => "UTF-8",
"line-length" => 76,
"line-break-chars" => "\n"
);
$preferences["scheme"] = "Q";
// 这将产生 "Subject: =?UTF-8?Q?Pr=C3=BCfung=20Pr=C3=BCfung?="
echo iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);

$preferences["scheme"] = "B";
// 这将产生 "Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?="
echo iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);
?>

参见

添加笔记

用户贡献的笔记 3 笔

1
cedric at gn dot apc dot org
12 年前
iconv_mime_encode() 不适合直接编码包含 RFC 1522 s4 & s5 中描述的“特殊字符”的头部,例如
<?php
$mimeprefs
= array ("scheme" => "Q",
"input-charset" => "utf-8",
"output-charset" => "utf-8",
"line-break-chars" => "\n");
$enc = iconv_mime_encode('From', '"Réal Namé" <[email protected]>', $prefs);
?>
将错误地尝试编码尖括号。要在 mb_encode_mimeheader() 的位置使用该函数,需要分别对单词进行编码,并删除多余的字段名

<?php
$encoded
= "From: \"". preg_replace('/^:\s+/', '', iconv_mime_encode("", $real, $mimeprefs))."\" <$email>";
?>

此外,根据 RFC 1522,大于 76 的 "line-length" 值是非法的,生成的编码词可能无法识别。(未测试,但 72 比较安全。)
0
shaman_master at list dot ru
4 年前
来自 mail(): 行的长度不应超过 70 个字符。不应是 76 也不应是 72!
0
markus AT birth MINUS online DOT de
14 年前
看起来这个函数与 mb_encode_mime() 存在相同的错误,对于长字符串的非 US-ASCII 字符来说也是如此。然后函数返回 false。这适用于 utf-8 到 utf-8 的“转换”。

<?php
$subject
= '您当前位置:首页 > 产品';

$prefs = array(
'scheme' => 'Q',
'input-charset' => 'UTF-8',
'output-charset' => 'UTF-8',
'line-length' => 76,
'line-break-chars' => "\r\n",
);

echo
'Original: ' . $subject . PHP_EOL;
$enc = iconv_mime_encode( 'Subject', $subject, $prefs );
var_dump( $enc ); // 将显示 bool(false)
?>

作为解决方法,您可以使用 explode() 函数以空格为分隔符将值分割成数组,并分别对每个单词进行编码。然后,删除结果字符串前面的“Subject: ”,并使用“\r\n ”(注意 \n 后面的空格)作为分隔符将它们连接起来。
To Top