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