Re: [问题] 中文编码问题

楼主: ccwang002 (亮)   2015-07-15 23:10:21
※ 引述《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 所有情况
作者: Czero (悠闲)   2015-07-16 01:46:00
第二种想法大致理解,太感谢你仔细地解说!

Links booklink

Contact Us: admin [ a t ] ucptt.com