参考链接:

  • 网络管理员在线工具
  • python模块之quopri: quoted-printable编解码

以下有关内容基于 Python 3:

Python 简易实现 quoted-printable 编码

目录

1. 什么是 quoted-printable 编码
2. 举例说明
3. 具体代码
4. 代码运行展示
5. 使用 quopri 库
6. 心得总结

一、什么是 quoted-printable 编码 ↶

quoted-printable 编码方法适用于所传送的数据中只有少量的非 ASCII 码,例如汉字。这种编码方法的要点就是对于可打印的 ASCII 码,除特殊字符等号 “=” 外,都不改变。等号 “=” 和不可打印的 ASCII 码以及非 ASCII 码的数据的编码方法是:现将每个字节的二进制代码用两个十六进制数字表示,然后在前面加上一个等号 “=”。
        例如,汉字的 “系统” 的二进制编码是:1100111 10110101 11001101 10110011(共有 32 位,但这四个字节都不是 ASCII码),其十六进制数字表示为:CFB5CDB3。用 quoted-printable 编码表示为:=CF=B5=CD=B3,这 12 个字符都是可打印的 ASCII 字符,它们的二进制编码需要 96 位,和原来的 32 位相比,开销达 200%。
        而等号 “=” 的二进制代码为 00111101,即十六进制的 3D,因此等号 “=” 的 quoted-printable 编码为 “=3D”。

相关内容,可参考:《计算机网络(第7版)》

二、举例说明 ↶

试将数据 01001100 10011101 00111001 进行 quoted-printable 编码,并得出最后传送的 ASCII 数据。这样的数据用 quoted-printable 编码后其编码开销有多大?
(1)01001100 1001101 00111001 有 3 个字节,中间的一个高位为 1,因此它不是 ASCII 码,需要使用 quoted-printable 编码。第一个和第三个字节是 ASCII 码,不变化。

(2)10011101 的十六进制表示是:9D,前面再加上等号 “=”,变成 “=9D”。

(3)=,9,D 的 8 位 ASCII 码分别为:
00111101 00111001 01000100
因此最后的结果是 5 个字节的数据:
01001100 00111101 00111001 01000100 00111001

(4)编码开销 = 5 - 3 = 2 字节。原来只有 3 字节的数据。用百分数表示的编码开销 = 23\frac{2}{3}32​ = 66.7%

三、具体代码 ↶

class QuoPri():def __init__(self, string):self.string_orig_list = list(string)ascii_string1 = ''.join([chr(i) for i in range(33, 61)])ascii_string2 = ''.join([chr(i) for i in range(62, 127)])self.ascii_string = ascii_string1 + ascii_string2print("可打印的ascii码( '=' 和 ' '  除外): {}".format(len(self.ascii_string)))def encode(self):string_encode_list =[]for item in self.string_orig_list:if item in self.ascii_string:string_encode_list.append(item)else:item_encode = item.encode()item_encode_list = list(item_encode)for each in item_encode_list:string_encode_list.append('=' + hex(each)[2: ].upper())return ''.join(string_encode_list)if __name__ == '__main__':test_string = "哔哩哔哩 (゜-゜)つロ 干杯~-bilibili"quopri = QuoPri(test_string)result = quopri.encode()print("original: {}".format(test_string))print("encode: {}".format(result))

四、代码运行展示 ↶

示例1:

test_string = "哔哩哔哩 (゜-゜)つロ 干杯~-bilibili"

结果1:

可打印的ascii码( '=' 和 ' '  除外): 93
original: 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
encode: =E5=93=94=E5=93=A9=E5=93=94=E5=93=A9=20(=E3=82=9C-=E3=82=9C)=E3=81=A4=E3=83=AD=20=E5=B9=B2=E6=9D=AF~-bilibili

示例2:

    test_string = "Bilibili,哔哩哔哩,哔哩哔哩动画,哔哩哔哩弹幕网,弹幕视频,B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,二次元,游戏视频,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid,日本动漫,国产动漫,手机游戏,网络游戏,电子竞技,ACG燃曲,ACG神曲,追新番,新番动漫,新番吐槽,巡音,镜音双子,千本樱,初音MIKU,舞蹈MMD,MIKUMIKUDANCE,洛天依原创曲,洛天依翻唱曲,洛天依投食歌,洛天依MMD,vocaloid家族,OST,BGM,动漫歌曲,日本动漫音乐,宫崎骏动漫音乐,动漫音乐推荐,燃系mad,治愈系mad,MAD MOVIE,MAD高燃"

结果2:

可打印的ascii码( '=' 和 ' '  除外): 93
original: Bilibili,哔哩哔哩,哔哩哔哩动画,哔哩哔哩弹幕网,弹幕视频,B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,二次元,游戏视频,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid,日本动漫,国产动漫,手机游戏,网络游戏,电子竞技,ACG燃曲,ACG神曲,追新番,新番动漫,新番吐槽,巡音,镜音双子,千本樱,初音MIKU,舞蹈MMD,MIKUMIKUDANCE,洛天依原创曲,洛天依翻唱曲,洛天依投食歌,洛天依MMD,vocaloid家族,OST,BGM,动漫歌曲,日本动漫音乐,宫崎骏动漫音乐,动漫音乐推荐,燃系mad,治愈系mad,MAD MOVIE,MAD高燃
encode: Bilibili,=E5=93=94=E5=93=A9=E5=93=94=E5=93=A9,=E5=93=94=E5=93=A9=E5=93=94=E5=93=A9=E5=8A=A8=E7=94=BB,=E5=93=94=E5=93=A9=E5=93=94=E5=93=A9=E5=BC=B9=E5=B9=95=E7=BD=91,=E5=BC=B9=E5=B9=95=E8=A7=86=E9=A2=91,B=E7=AB=99,=E5=BC=B9=E5=B9=95,=E5=AD=97=E5=B9=95,AMV,MAD,MTV,ANIME,=E5=8A=A8=E6=BC=AB,=E5=8A=A8=E6=BC=AB=E9=9F=B3=E4=B9=90,=E6=B8=B8=E6=88=8F,=E6=B8=B8=E6=88=8F=E8=A7=A3=E8=AF=B4,=E4=BA=8C=E6=AC=A1=E5=85=83,=E6=B8=B8=E6=88=8F=E8=A7=86=E9=A2=91,ACG,galgame,=E5=8A=A8=E7=94=BB,=E7=95=AA=E7=BB=84,=E6=96=B0=E7=95=AA,=E5=88=9D=E9=9F=B3,=E6=B4=9B=E5=A4=A9=E4=BE=9D,vocaloid,=E6=97=A5=E6=9C=AC=E5=8A=A8=E6=BC=AB,=E5=9B=BD=E4=BA=A7=E5=8A=A8=E6=BC=AB,=E6=89=8B=E6=9C=BA=E6=B8=B8=E6=88=8F,=E7=BD=91=E7=BB=9C=E6=B8=B8=E6=88=8F,=E7=94=B5=E5=AD=90=E7=AB=9E=E6=8A=80,ACG=E7=87=83=E6=9B=B2,ACG=E7=A5=9E=E6=9B=B2,=E8=BF=BD=E6=96=B0=E7=95=AA,=E6=96=B0=E7=95=AA=E5=8A=A8=E6=BC=AB,=E6=96=B0=E7=95=AA=E5=90=90=E6=A7=BD,=E5=B7=A1=E9=9F=B3,=E9=95=9C=E9=9F=B3=E5=8F=8C=E5=AD=90,=E5=8D=83=E6=9C=AC=E6=A8=B1,=E5=88=9D=E9=9F=B3MIKU,=E8=88=9E=E8=B9=88MMD,MIKUMIKUDANCE,=E6=B4=9B=E5=A4=A9=E4=BE=9D=E5=8E=9F=E5=88=9B=E6=9B=B2,=E6=B4=9B=E5=A4=A9=E4=BE=9D=E7=BF=BB=E5=94=B1=E6=9B=B2,=E6=B4=9B=E5=A4=A9=E4=BE=9D=E6=8A=95=E9=A3=9F=E6=AD=8C,=E6=B4=9B=E5=A4=A9=E4=BE=9DMMD,vocaloid=E5=AE=B6=E6=97=8F,OST,BGM,=E5=8A=A8=E6=BC=AB=E6=AD=8C=E6=9B=B2,=E6=97=A5=E6=9C=AC=E5=8A=A8=E6=BC=AB=E9=9F=B3=E4=B9=90,=E5=AE=AB=E5=B4=8E=E9=AA=8F=E5=8A=A8=E6=BC=AB=E9=9F=B3=E4=B9=90,=E5=8A=A8=E6=BC=AB=E9=9F=B3=E4=B9=90=E6=8E=A8=E8=8D=90,=E7=87=83=E7=B3=BBmad,=E6=B2=BB=E6=84=88=E7=B3=BBmad,MAD=20MOVIE,MAD=E9=AB=98=E7=87=83

五、使用 quopri 库 ↶

代码:

import quopria = "哔哩哔哩 (゜-゜)つロ 干杯~-bilibili"
b = quopri.encodestring(a.encode())
c = quopri.decodestring(b)
print("raw: {}".format(a))
print("encode: {}".format(b))
print("decode: {}".format(c.decode()))

结果:

raw: 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
encode: b'=E5=93=94=E5=93=A9=E5=93=94=E5=93=A9 (=E3=82=9C-=E3=82=9C)=E3=81=A4=E3=83=\n=AD =E5=B9=B2=E6=9D=AF~-bilibili'
decode: 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

六、心得总结 ↶

简单地用 Python 实现了 quoted-printable 编码,并发现了用 quopri 库可以轻松实现其编码。人生苦短,我用 Python !

点我回顶部 ☚

Fin.

Python 简易实现 quoted-printable 编码相关推荐

  1. python简易有道词典

    0.说明 通过浏览器跟踪[有道词典]和[有道翻译]网页查询过程,制作python简易字典. 代码案例在:https://github.com/suchocolate/test/tree/master/ ...

  2. python简易英文字典_Python简单有道字典,python,简易,词典

    0.说明 通过浏览器跟踪[有道词典]和[有道翻译]网页查询过程,制作python简易字典. 制作过程: 踩点查词 踩点翻译 制作程序 1.踩点有道词典 1.1 先踩点查英文单词 F12浏览器登陆有道词 ...

  3. Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式

    Python 对图像进行base64编码及解码读取为numpy.opencv.matplot需要的格式 1. 效果图 2. 源码 参考 这篇博客将介绍Python如何对图像进行base64编解码及读取 ...

  4. 【廖雪峰python入门笔记】Unicode编码_UnicodeDecodeError处理

    1.Unicode编码的由来 字符串还有一个编码问题. 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以, ...

  5. python numpy数组和one-hot编码相互转换

    a=[0,0,1,0,1,0,1]result=[] for i, x in enumerate(a):if x==1:result.append(i)print(result) python num ...

  6. python代码大全o-python文件编码及执行

    兼容中文编码 由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码. 当Python解释器读取源代码时,为了让它按UTF-8编 ...

  7. python 简易HTTP服务器搭建

    安装Python简易HTTP服务器 大多数Linux/Unix/mac OS操作系统都已默认安装,直接运行以下命令即可,其中"8008"为指定的端口号:如果没有安装python,可 ...

  8. python模块之email: 电子邮件编码解码 (一、解码邮件)

    https://yq.aliyun.com/articles/54621 python模块之email: 电子邮件编码解码 (一.解码邮件) python自带的email模块是个很有意思的东西,它可以 ...

  9. python进阶10 MySQL补充 编码、别名、视图、数据库修改

    python进阶10 MySQL补充    编码.别名.视图.数据库修改 一.编码问题 #MySQL级别编码 #修改位置: /etc/mysql/mysql.conf.d/mysqld.cnf def ...

最新文章

  1. java二级下拉菜单_航菜单栏中的二级下拉菜单
  2. undefined reference to cv::_InputArray::_InputArray(cv::Mat const)
  3. STM32 UART串口驱动程序
  4. hadoop集群中的日志文件
  5. 深度学习之卷积神经网络 ZF Net
  6. 教你如何在项目中集成推送功能
  7. matlab打开矩阵表,如何将Excel数据导入MATLAB中?:EXCLE中通过矩阵表输出选项
  8. 在基于对话框的MFC创建状态栏以及添加时间显示
  9. file_put_contents记录的日志内容丢失
  10. Anytime项目开发记录3
  11. 老程序员为什么从不使用 Java 自带的序列化?
  12. python游戏设计毕业论文_游戏设计游戏策划毕业论文
  13. php微信h5支付对接流程,微信H5支付接口开发的流程与常见问题
  14. 中国大学MOOCPython语言程序设计基础学习笔记和课后练习5-6周(南京邮电大学)
  15. 通达OA2015版与金蝶K3系统集成方案
  16. 2016春招腾讯笔试题
  17. 句子反转(小米2017秋招真题)
  18. 在北京尚学堂的第三个周末
  19. visio 中取消 交叉连接线的拱形的方法
  20. (三篇长文让你玩6Pandas)数据分析入门_PART2常用工具包_CH02数据分析工具:Pandas__Part03(统计分析基础)

热门文章

  1. 功能测试VS性能测试
  2. 数据化是什么,企业为什么要数据化管理?【Teamface企典】
  3. 使用OpenVINO实现飞桨版PGNet推理程序
  4. dns 劫持是什么意思,DNS劫持有啥解决办法?
  5. 用友U9产品SOA设计架构遭技术质疑
  6. 搞IT的you知道这些么……
  7. HDMI 调试之输出RGB888
  8. BZOJ 2563 阿狸和桃子的游戏
  9. 开始使用 Elasticsearch (1)
  10. android studio hiera,速成意大利语第课 昨天晚上我在电视机前我们不能空手去那里.doc...