Python3完成QUOTED-PRINTABLE编码及反翻译
想⽣成⼀个vcf时遇到了从字符串到 Quoted Printable编码转换的问题
1. 从⼿机⾥导出的vcf是这样的格式:
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E5=B7=A5=E4=BC=9A=E7=9B=9F=E7=BB=8F=E6=B5=8E;;; FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=B7=A5=E4=BC=9A=E7=9B=9F=E7=BB=8F=E6=B5=8E TEL;CELL:3000000100
END:VCARD
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E5=B7=A5=E4=BC=9A=E9=98=BF=E6=97=97=E5=B8=B8;;; FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=B7=A5=E4=BC=9A=E9=98=BF=E6=97=97=E5=B8=B8 TEL;CELL:3000000101
END:VCARD
2. 百度了⼀下, QUOTED-PRINTABLE是邮件常⽤的编码⽅式, python中有⼀个对应的模块 quopri
反编译:
In[189]: quopri.decodestring('=E5=B7=A5=E4=BC=9A=E7=9B=9F=E7=BB=8F=E6=B5=8E').decode('utf-8')
Out[189]: '⼯会盟经济'
编译:
In[191]: destring('⼯会盟经济'.encode())
Out[191]: b'=E5=B7=A5=E4=BC=9A=E7=9B=9F=E7=BB=8F=E6=B5=8E'
3. 然⽽, 进⼀步发现英⽂字符的处理有问题
In[192]: destring('Hello'.encode())
Out[192]: b'Hello'
这显然是不合理的
==> 百度到了这样的⽅法: bytes(engCharacter, encoding='unicode_escape').hex() 验证⼀下:
In[194]: bytes('Hello ', encoding='unicode_escape').hex()
Out[194]: '48656c6c6f20'
In[195]:
quopri.decodestring('=48=65=6C=6C=6F=20=E5=B7=A5=E4=BC=9A=E7=9B=9F=E7=BB=8F=E6=B5=8E').decode('utf-8')
Out[195]: 'Hello ⼯会盟经济'
4. 看起来问题变得很简单了: 给我⼀段⽂本, 我拆分出中⽂的部分, 英⽂的部分, 以不同的⽅法编译再拼接就可以了
例如: 'Hello ⼯会盟经济', ''⼯会盟经济Hello '', 'He⼯会盟经济llo '
a) 先判断是否有⾮中⽂字符: '\u4e00' <= i <= '\u9fa5' :
没有的话, 直接使⽤2⾥的 encodestring函数
有的话, 中⽂部分使⽤destring; 英⽂使⽤ bytes(str, encoding='unicode_escape').hex(); 然后再拼接就可以了
拆分很简单, engPartNameList = re.findall('[a-zA-Z]+',originalName) 即可提取出对应的英⽂字符串
但是拼接很⿇烦, 需要把engPartNameList ⾥的每个元素与originalName对应起来, 注意前后顺序; ⽽且还有⼀个风险, 很多字符集,例如 空格, 中⾏线, 等
我在a这个⽜⾓尖⾥想了⼀天, 终于想到了简单的⽅法b:
b) 将originalName⾥每个字符做了判断, ⾮中⽂字符, 就使⽤bytes函数, 中⽂字符, 就使⽤destring函数, 然后拼接即可
代码如下:
def engNameToQuoPriStr(engCharacter): #⾮中⽂字符编码
quotedPrintableName = '=' + bytes(engCharacter, encoding='unicode_escape').hex().upper() return quotedPrintableName
def chinNameToQuoPriStr(chinCharacter): #⾮中⽂字符编码
byteName = de())
python代码转换quotedPrintableName = str(byteName)[2:-1]
return quotedPrintableName
def UtfNameToQuoPriStr(realName):
quotedPrintableName = ''
for i in realName:
if '\u4e00' <= i <= '\u9fa5':
quotedPrintableName += chinNameToQuoPriStr(i)
else:
quotedPrintableName += engNameToQuoPriStr(i)
return quotedPrintableName
事后验证, 即使包含表情符也是正确的, 哈
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论