Maccoy 函数不可靠,因为它不遵循 RFC 2060。它对大多数拉丁字符(在 base64 中将转换为 "+A...")可以正常工作,但对于其他语言可能会造成混乱。如果您使用的是国际化系统,请尝试使用其他选项。
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_utf7_encode — 将 ISO-8859-1 字符串转换为修改后的 UTF-7 文本
将 string
转换为修改后的 UTF-7 文本。
这需要对包含某些不在可打印 ASCII 字符范围内的字符的邮箱名称进行编码。
string
一个 ISO-8859-1 字符串。
返回使用 » RFC 2060,第 5.1.3 节中定义的修改后的 UTF-7 编码编码的 string
。
Maccoy 函数不可靠,因为它不遵循 RFC 2060。它对大多数拉丁字符(在 base64 中将转换为 "+A...")可以正常工作,但对于其他语言可能会造成混乱。如果您使用的是国际化系统,请尝试使用其他选项。
这种编码不适用于 Cyrus imapservers,您可能会在其他邮件客户端遇到问题。
使用 mb_convert_encoding($str, "UTF7-IMAP","ISO-8859-15") 代替。
ps:mb_convert_encoding() 需要在构建 php 时使用 --enable-mbstring 选项
对于那些正在寻找适用于 IMAP 的修改后的 UTF-7 编码的良好实现的人,您可以在以下位置找到一个可用的代码
http://tananyag.ntszki.hu/mail/functions/imap_utf7_local.php
结果与 imap-utf7-encode() 函数不同,与 Thunderbird 生成的邮箱名称相同。
请注意,php4 (4.4.0) 将以其他程序无法将其解码回原样的方式对 IMAP 文件夹进行编码。
$ php4 <<EOF
> <?php
> echo "ENCODED: " . imap_utf7_encode("?") . "\\n";
> ?>
> EOF
ENCODED: &w5w-
现在尝试使用例如 javamail 或 python 的 imaplib 解码结果字符串 ("&w5w-"),或者如果您不喜欢这些语言 - 使用 PHP 创建一个 IMAP 文件夹,并尝试在 IMAP 客户端 (mutt, thunderbird, outlook, 无论什么) 中显示它。
<?php
/**
* @return 编码字符串
* @param string $str
* @desc 将 str 转换为 UTF-7 imap 默认邮箱名称
(imap_utf7_encode 不会构建相同的结果)
*/
function getEncodedUtf7($str){
if(!$str){
echo "error: 您需要提供一个字符串参数。";
return false;
}
# 将空格更改为熵,因为 mb_convert 对空格会失败
$str=ereg_replace(" ","xyxy",$str);
# 如果 mb_convert 可以工作
if($str=mb_convert_encoding($str,"UTF-7")){
# 更改字符
$str=preg_replace("/\+A/","&A",$str);
# 再次更改为空格
$str=preg_replace("/xyxy/"," ",$str);
# 返回编码字符串
return $str;
# 否则
}else{
# 打印错误并返回 false
echo "error: 无法对该字符串 ' "$str' 进行编码。[".
imap_last_error().
"]";
return false;
}
}
?>