PHP Conference Japan 2024

iconv_mime_encode

(PHP 5, PHP 7, PHP 8)

iconv_mime_encode组合MIME头部字段

描述

iconv_mime_encode(字符串 $field_name, 字符串 $field_value, 数组 $options = []): 字符串|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

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

iconv_mime_encode()支持的配置项
类型 描述 默认值 示例
scheme 字符串 指定用于编码字段值的方法。此项的值可以是“B”或“Q”,其中“B”代表base64编码方案,“Q”代表quoted-printable编码方案。 B B
input-charset 字符串 指定第一个参数field_name和第二个参数field_value所使用的字符集。如果没有给出,iconv_mime_encode()假定这些参数以iconv.internal_encoding ini 设置中指定的字符集提供。 iconv.internal_encoding ISO-8859-1
output-charset 字符串 指定用于组合MIME头的字符集。 iconv.internal_encoding UTF-8
line-length 整数 指定头部行的最大长度。如果生成的头部字段长度超过此参数的值,则生成的头部将根据» RFC2822 - Internet Message Format折叠成多行。如果没有给出,长度将限制为76个字符。 76 996
line-break-chars 字符串 指定在对长头部字段进行“折叠”时,追加到每一行作为行尾标志的字符序列。如果没有给出,则默认为“\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>";
?>

此外,“行长”值大于 76 将违反 RFC 1522 规范,生成的编码字可能无法识别。(未经测试,但 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 字符时存在相同的 bug。该函数将返回 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