问题描述
我的理解是,原始SMTP协议被定义为仅使用7位来限制字符传输,以节省传输成本。
该协议已有近40年的历史,从那时起,多个RFC扩展了标准。
出于兼容性原因,许多(如果不是大多数的话)现代服务器都是8位干净的,它们会将消息转换为“ 7位兼容”格式,例如quoted-printable或base64。
所以从技术上讲,所有字符都是7位ASCII。
但是,我的问题的症结在于,即使以7位友好方式对数据进行编码,这是否意味着SMTP服务器之间的物理位传输以7位为单位发生,还是以8位发生? >
我的假设是,即使数据以ASCII编码,它也以8位发生。这是正确的吗?
以下是我找到的一些相关链接:
>
http://cr.yp.to/smtp/8bitmime.html
>
https://www.ibm.com/support/knowledgecenter/en/SSB27U_6.4.0/com.ibm.zvm.v640.kiml0/smtmlfr.htm
>
https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#8BITMIME
更新
我的问题的细化应为:今天的SMTP服务器是否仍然清除高位,并仅使用低7位对7位ASCII编码,还是它们实际上使用完整的八位位组,从而使MSB显得无用?
解决方法
我认为您要问的是:“ SMTP客户端在将消息发送到SMTP服务器时是否将位移位,以便每个字符仅使用7位,而第8位是下一个字符的开头?”
如果是,则不会。事实并非如此。
从一开始,SMTP客户端/服务器就一直使用每个字符的所有8位。
换句话说,SMTP客户端和服务器使用的ASCII字符编码不包括在8位字符编码(例如ISO-8859-1)中发现的重音字符。 ASCII编码中值大于127的字符被视为未定义。
可能有多种原因:
- ASCII易于支持
- 每个语言环境都有自己首选的扩展字符编码,该编码与其他语言环境不兼容-其中一些语言需要一个字节以上才能表示一个字符。
- 我不确定是否还存在UTF-8(但我认为是多字节unicode,例如UCS2 / UTF-16)
- 期望如此之多的软件在所有广泛使用的字符集之间实现字符集转换是困难且不切实际的(当时unicode和charset转换库并不那么普及)
- 在MIME,SMTP等之前的“ MESSAGE”规范是为美国“互联网”编写的,可能不需要ASCII以外的任何内容(因此,原始消息规范,例如rfc0822和更早的版本未定义编码机制)。