7bit传输编码和UTF-7、8bit和UTF-8之间可能有什么关系?
如下面的代码所示手动将消息正文编码转换为预期编码(假设“utf-8”)是否有意义?
function decodeBody($body, $transferEncoding, $bodyEncoding) {
switch ($transferEncoding) {
case '7BIT' :
case '8BIT' :
// any additional decoding here ?
$body = mb_convert_encoding($body, 'utf-8', $bodyEncoding);
break;
case 'BASE64' :
$body = base64_decode($body);
$body = mb_convert_encoding($body, 'utf-8', $bodyEncoding);
break;
case 'QUOTED_PRINTABLE' :
$body = quoted_printable_decode($body);
$body = mb_convert_encoding($body, 'utf-8', $bodyEncoding);
break;
}
return $body;
}
引用RFC1341:
值“8bit”、“7bit”和“binary”都表示未执行任何编码... “8bit”表示行很短,但可能存在非 ASCII 字符(设置了高位的八位字节)。
这意味着 7bit 是纯 ascii,您根本不需要将其转换为 UTF-8(因此在这种情况下无需使用
mb_convert_encoding()
)。 “8bit”意味着可能存在非ascii字符,但据我了解,它不一定是UTF-8字符集编码——可能是iso-8859-1或其他字符。所以据我所知“8bit”并不自动意味着 UTF-8。
不,无需解码
根据 RFC 822,原始 SMTP 协议被设计为以 7 位格式(原始 ASCII)传输消息。
因此任何第 8 位设置为 1 的消息都应该以某种方式进行编码。
7 位 意味着完全需要编码。
8 位 表示这是一条 8 位干净的消息,并且 SMTP 服务器没有更改该消息。它不需要在接收端进行解码。 但如果您想使用 SMTP 发送消息,则必须将其编码为“7bit”或“quote-printable”(不使用消息中的第 8 位)
所以你根本不需要这行:
$body = mb_convert_encoding($body, 'utf-8', $bodyEncoding);