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 - 網際網路訊息格式「摺疊」成多行。如果未指定,長度將限制為 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 則註記

cedric at gn dot apc dot org
12 年前
iconv_mime_encode() 並不直接適用於編碼包含 RFC 1522 第 4 節和第 5 節中所述「特殊字元」的標頭,例如
<?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é" <user@example.com>', $prefs);
?>
會錯誤地嘗試編碼角括號。要使用此函數代替 mb_encode_mimeheader(),您需要分別編碼文字,並移除多餘的欄位名稱

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

此外,根據 RFC 1522,「line-length」的值大於 76 是不合法的,且產生的編碼文字可能無法被識別。(未經測試,但 72 會更安全。)
shaman_master at list dot ru
4 年前
來自 mail():每一行不應超過 70 個字元。不是 76 也不是 72!
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 」(換行後別忘了空格) 作為分隔符號,將它們用 join() 函數連接起來。
To Top