作者ccwang002 (亮)
看板Python
标题Re: [问题] 中文编码问题
时间Wed Jul 15 23:10:21 2015
※ 引述《Czero (悠闲)》之铭言:
: 使用python3~
: 假设我取得一个中文已经编码过的字串
: d='\\xab\\xa2\\xc5o'
: print(d)
: 我想要印出原始中文该如何印呢?
(恕删)
EDIT: TP 大大给了个比较好的方法:
>>> cleaned = d.encode('latin1').decode('unicode_escape')
>>> cleaned
'\xab\xa2\xc5o'
>>> cleaned.encode('latin1').decode('big5')
'哈罗'
下面是用硬干的效率很差。
这个东西要还原要一些工夫,首先 '\xab' 这是一个 char, '\\xab' 是三个 char
所以要回复就要强制做先把 'ab' 换成 16 进位表示的值,再转成 char
>>> int('ab', 16)
171
>>> chr(int('ab', 16)) # 等同於 chr(171)
'\xab'
写成完整的 code
import re
d = '\\xab\\xa2\\xc5o'
unit_repr_regex = r'(\\x[0-9a-f]{2})'
repr_to_chr = {
s: chr(int(s[-2:]), 16)
for s in set(re.findall(unit_repr_regex, d))
}
d_corrected = d
for chr_repr, chr_ in repr_to_chr:
d_corrected = d_corrected.replace(chr_repr, chr_)
d_corrected = d_corrected.encode('latin1').decode('big5')
print(d_corrected) # 哈罗
PS 注意中间有个变数为了不要盖到内建函式 chr() 命名成 chr_
PS2 如果转换很多的话,不妨 repr_to_chr 直接建完 0-255 所有情况
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.44.9.167
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1436973024.A.D79.html
※ 编辑: ccwang002 (114.44.9.167), 07/15/2015 23:18:09
1F:推 Czero: 第二种想法大致理解,太感谢你仔细地解说! 07/16 01:46