Quoted-printable编码认识、介绍、编码解码转换
我们在做接收邮件时,有些邮件的Content-Transfer-Encoding类型为quoted-printable
Quoted-printable 可译为“可打印字符引⽤编码”、“使⽤可打印字符的编码”,邮件接收时会显⽰如下的乱码:
最多时候,我们在邮件头⾥⾯能够看到这样的编码!Content-Transfer-Encoding:quoted-printable
它是多⽤途互联⽹邮件扩展(MIME) ⼀种实现⽅式。其中MIME是⼀个互联⽹标准,它扩展了电⼦邮件标准,致⼒于使其能够⽀持⾮ASCII 字符、⼆进制格式附件等多种格式的邮件消息。⽬前http协议中,很多采⽤MIME框架!quoted-printable 就是说⽤⼀些可打印常⽤字符,表⽰⼀个字节(8位)中所有⾮打印字符⽅法!
Quoted-printable编码⽅法
任何⼀个8位的字节值可编码为3个字符:⼀个等号”=”后跟随两个⼗六进制数字(0–9或A–F)表⽰该字节的数值.例如,ASCII码换页符(⼗进制值为12)可以表⽰为”=0C”, 等号”=”(⼗进制值为61)必须表⽰为”=3D”. 除了可打印ASCII字符与换⾏符以外,所有字符必须表⽰为这种格式.
所有可打印ASCII字符(⼗进制值的范围为33到126)可⽤ASCII字符编码来直接表⽰, 但是等号”=”(⼗进制值为61)不可以这样直接表⽰.ASCII的⽔平制表符(tab)与空格符, ⼗进制为9和32, 如果不出现在⾏尾则可以⽤其ASCII字符编码直接表⽰。如果这两个字符出现在⾏尾,必须QP编码表⽰为”=09″ (tab)或”=20″ (space).
如果数据中包含有意义的⾏结束标志,必须转换为ASCII回车(CR)换⾏(LF)序列,既不能⽤原来的ASC
II字符也不能⽤QP编码的”=”转义字符序列。 相反,如果字节值13与10有其它的不是⾏结束的含义,它们必须QP编码为=0D与=0A.
quoted-printable编码的数据的每⾏长度不能超过76个字符. 为满⾜此要求⼜不改变被编码⽂本,在QP编码结果的每⾏末尾加上软换⾏(soft line break). 即在每⾏末尾加上⼀个”=”, 但并不会出现在解码得到的⽂本中.
例如:If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy. 编码后结果是
If you believe that truth=3Dbeauty, then surely=20=
mathematics is the most beautiful branch of philosophy.
编码⾥⾯,有⼏个特定限定,⼀些可打印字符不⽤编码,当然如果你按照规范编码后,也⼀样可以显⽰的!因此⾃⼰简单⾃⼰实现该编码:
function quoted_printable_encode($string) {
return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%","=",
rawurlencode($string)));
}
⼀个函数就可以,将所有字符串urlencode转换后,%号替换为”=”号,然后对⾮\r\n超过73连续字符,后⾯加⼀个=\r\n。这个是简单实现⽅法! 按照该编码详细说明⾥⾯,有些空格、换⾏,还有⼀些特殊字符可以不⽤转换。不过⼀起转换了,也不会有影响!
PHP中可以使⽤下⾯1对函数进⾏编码和解码:
二进制编码转换quoted_printable_encode() 函数把 8 位字符串转换为 quoted-printable 字符串。
quoted_printable_decode() 对经过 quoted-printable 编码后的字符串进⾏解码,返回 8 位的 ASCII 字符串
很多时候,我们⽤些常见字符表⽰所有8位其它⾮打印字符,这种通过,Quoted-printable编码,只是对该字节转为16进制后,做简单增加前缀!然后做些特殊字符处理即可! 它的简单,及编码⾼效,也让该编码在邮件格式⾥⾯,得到了⼴泛使⽤!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论