imap_utf7_decode

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

imap_utf7_decode解码经过修改的 UTF-7 编码字符串

说明

imap_utf7_decode(string $string): string|false

将经过修改的 UTF-7 string 解码为 ISO-8859-1 字符串。

此函数用于解码包含不在可打印 ASCII 字符范围内的特定字符的邮箱名称。

参数

string

经过修改的 UTF-7 编码字符串,如 » RFC 2060 第 5.1.3 节中所定义。

返回值

返回一个以 ISO-8859-1 编码的字符串,其中包含与 string 中相同的字符序列,如果 string 包含无效的经过修改的 UTF-7 序列或 string 包含不在 ISO-8859-1 字符集中的字符,则返回 false

参见

添加备注

用户贡献的备注 4 个备注

10
匿名
9 年前
我找不到将 imap utf7 转换为 utf8 的方法。
所以我不得不编写几行代码来解决这个问题。也许这可能有用。这里没有错误处理,但可以添加。

用法
$imap_utf7 = '[Gmail]/&BBIEMAQ2BD0EPgQ1-';
$utf8 = ImapUtf7::decode($imap_utf7);
$imap_utf7_2 = ImapUtf7::encode($utf8);

[ImapUtf7.php]
<?php
class ImapUtf7 {
static
$imap_base64 =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,';
static private function
encode_b64imap($s) {
$a=0; $al=0; $res=''; $n=strlen($s);
for(
$i=0;$i<$n;$i++) {
$a=($a<<8)|ord($s[$i]); $al+=8;
for(;
$al>=6;$al-=6) $res.=self::$imap_base64[($a>>($al-6))&0x3F];
}
if (
$al>0) { $res.=self::$imap_base64[($a<<(6-$al))&0x3F]; }
return
$res;
}
static private function
encode_utf8_char($w) {
if (
$w&0x80000000) return '';
if (
$w&0xFC000000) $n=5; else
if (
$w&0xFFE00000) $n=4; else
if (
$w&0xFFFF0000) $n=3; else
if (
$w&0xFFFFF800) $n=2; else
if (
$w&0xFFFFFF80) $n=1; else return chr($w);
$res=chr(( (255<<(7-$n)) | ($w>>($n*6)) )&255);
while(--
$n>=0) $res.=chr((($w>>($n*6))&0x3F)|0x80);
return
$res;
}
static private function
decode_b64imap($s) {
$a=0; $al=0; $res=''; $n=strlen($s);
for(
$i=0;$i<$n;$i++) {
$k=strpos(self::$imap_base64,$s[$i]); if ($k===FALSE) continue;
$a=($a<<6)|$k; $al+=6;
if (
$al>=8) { $res.=chr(($a>>($al-8))&255);$al-=8; }
}
$r2=''; $n=strlen($res);
for(
$i=0;$i<$n;$i++) {
$c=ord($res[$i]); $i++;
if (
$i<$n) $c=($c<<8) | ord($res[$i]);
$r2.=self::encode_utf8_char($c);
}
return
$r2;
}
static function
encode($s) {
$n=strlen($s);$err=0;$buf='';$res='';
for(
$i=0;$i<$n;) {
$x=ord($s[$i++]);
if ((
$x&0x80)==0x00) { $r=$x;$w=0; }
else if ((
$x&0xE0)==0xC0) { $w=1; $r=$x &0x1F; }
else if ((
$x&0xF0)==0xE0) { $w=2; $r=$x &0x0F; }
else if ((
$x&0xF8)==0xF0) { $w=3; $r=$x &0x07; }
else if ((
$x&0xFC)==0xF8) { $w=4; $r=$x &0x03; }
else if ((
$x&0xFE)==0xFC) { $w=5; $r=$x &0x01; }
else if ((
$x&0xC0)==0x80) { $w=0; $r=-1; $err++; }
else {
$w=0;$r=-2;$err++; }
for(
$k=0;$k<$w && $i<$n; $k++) {
$x=ord($s[$i++]); if ($x&0xE0!=0x80) { $err++; }
$r=($r<<6)|($x&0x3F);
}
if (
$r<0x20 || $r>0x7E ) {
$buf.=chr(($r>>8)&0xFF); $buf.=chr($r&0xFF);
} else {
if (
strlen($buf)) {
$res.='&'.self::encode_b64imap($buf).'-';
$buf='';
}
if (
$r==0x26) { $res.='&-'; } else $res.=chr($r);
}
}
if (
strlen($buf)) $res.='&'.self::encode_b64imap($buf).'-';
return
$res;
}
static function
decode($s) {
$res=''; $n=strlen($s); $h=0;
while(
$h<$n) {
$t=strpos($s,'&',$h); if ($t===false) $t=$n;
$res.=substr($s,$h,$t-$h); $h=$t+1; if ($h>=$n) break;
$t=strpos($s,'-',$h); if ($t===false) $t=$n;
$k=$t-$h;
if (
$k==0) $res.='&';
else
$res.=self::decode_b64imap(substr($s,$h,$k));
$h=$t+1;
}
return
$res;
}
}
5
匿名
21 年前
对于“Outlook 风格”的 UTF-7,您也可以使用

mb_convert_encoding( $str, "ISO_8859-1", "UTF7-IMAP" ); # 用于解码
mb_convert_encoding( $str, "UTF7-IMAP", "ISO_8859-1" ); # 用于编码
3
Min He
14 年前
对于中文字符集,我们可以使用

mb_convert_encoding($mailbox, "UTF7-IMAP", "GB2312");

当您想创建一个中文邮箱时。

或者

mb_convert_encoding($mailbox, "GB2312", "UTF7-IMAP");

当您想以正确的字符集显示列出的邮箱时。
-2
sven at planb dot de
23 年前
imap_utf7_decode 解码“经过修改的”。
为了解码 Outlook UTF-7 - 文本,我使用 --enable-recode 和 $latin1string=recode_string("UTF-7..ISO_8859-1",$utf7string);
不要使用 Contrib 中的 recode-3.5c.*rpm。
recode_string 似乎有错误。
To Top