PHP Conference Japan 2024

imap_mime_header_decode

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

imap_mime_header_decode解碼 MIME 標頭元素

說明

imap_mime_header_decode(字串 $string): 陣列|false

解碼非 ASCII 文字的 MIME 訊息標頭擴充(參閱 » RFC2047)。

參數

字串

MIME 文字

回傳值

解碼後的元素會以物件陣列的形式回傳,其中每個物件都有兩個屬性,分別為 charsettext

如果元素沒有被編碼,也就是說,它是以純 US-ASCII 表示,則該元素的 charset 屬性會被設定為 default

函式在失敗時會回傳 false

範例

範例 #1 imap_mime_header_decode() 範例

<?php
$text
= "=?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@example.com>";

$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:  <keld@example.com>

在上面的範例中,我們會有兩個元素,其中第一個元素先前已使用 ISO-8859-1 編碼,而第二個元素將是純 US-ASCII。

參閱

  • imap_utf8() - 將 MIME 編碼的文字轉換為 UTF-8

新增筆記

使用者貢獻筆記 1 個筆記

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;
}
?>
To Top