zoukankan      html  css  js  c++  java
  • QP编码详解

     介绍Quote-Printable编码。


    MIME定义了两种编码方法,其中一种是BASE64,另一种是Quote-Printable,即QP编码。前一种大家应该很熟悉,而后一种相对陌生。


    前面已经介绍过MIME格式:

    MIME格式解析


    本文将介绍QP编码。


    01

    原理


    QP编码是一种使用可打印的ASCII字符 (如字母、数字与"=")表示各种编码格式下的字符。其方法是将一个8bit的字符表示成两个16进制数,并在前面加一个“=”,共三个ASCII字符。


    经过QP编码后的数据,通常是下面这个样子:

    =E5=8D=8F=E8=AE=AE=E5=88=86=E6=9E=90=E4=B8=8E=E8=BF=98=E5=8E=9F


    对QP编码而言,所有ASCII字符都可以直接用ASCII字符编码来直接表示,但是有一个例外,就是字符“=”,它将在QP编码中根据其十进制值被编码为“=3D”,因为它在编码过程中被使用。


    另外,对制表符和空格符,即tab和space,虽然规定如果不出现在行尾可以用其ASCII字符编码直接表示,在行尾才需要被编码,但是实际应用中基本上都是统一处理,分别表示为“=09”(tab)和“=20”(space)。


    而数据中的换行,即行结束标志,则需要转换为回车加换行,最终为0x0d0x0a,而最终的编码则是“=0D=0A”。


    QP编码规定编码后的数据每行不能超过76个字符。当超过这个限制时,将在编码结果中使用软换行进行分行,即每75个字符后增加一个“=”,然后再接上换行CRLF,之后开始新的一行,这个“=”在解码的时候并不会解出任何数据。


    02


    例子


    回头再看上文中的QP编码数据:

    =E5=8D=8F=E8=AE=AE=E5=88=86=E6=9E=90=E4=B8=8E=E8=BF=98=E5=8E=9F


    解码后即为"协议分析与还原"UTF8编码,每三个字节表示一个汉字:

    640?wx_fmt=png

    可以看出,对QP编码进行解码相当简单,即将可见字符中除行结束外的每个“=”之后的两个ASCII字符直接当成一个16进制数值进行处理即可。


    至于解QP编码的工具,网上很多,这里给一个:

    http://web.chacuo.net/charsetquotedprintable


    有什么问题,可联系我交流。

    640?wx_fmt=jpeg

    长按进行关注。





  • 相关阅读:
    结构体和枚举
    [转载]玩转Asp.net MVC 的八个扩展点
    SQLServer处理亿万级别的数据的优化措施
    Lambda表达式
    匿名类型
    单例模式——懒汉式和饿汉式详解
    Cglib动态代理实现原理
    集合的子集
    深入剖析ThreadLocal
    java注解的自定义和使用
  • 原文地址:https://www.cnblogs.com/protosec/p/11673332.html
Copyright © 2011-2022 走看看