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

    长按进行关注。





  • 相关阅读:
    week4:周测错题
    小程序1:登录/注册小程序
    小程序2:实现一个购物车
    day26:装饰器&面向对象当中的方法&property
    day25:7个魔术方法&5个关于类的魔术属性
    day24:多态&魔术方法__new__&单态模式
    day23:单继承&多继承&菱形继承&__init__魔术方法
    day22:面向对象封装对象操作&类操作&面向对象删除操作
    day21:正则函数&模块和包(import)
    APP探索之iAPP
  • 原文地址:https://www.cnblogs.com/protosec/p/11673332.html
Copyright © 2011-2022 走看看