我正在使用Python的zipfile模块来提取.zip文件,这些文件可以包含带有Unicode文件名的文件。 WinZip和7-Zip档案工作正常,但WinRAR对文件名的编码方式略有不同。假设我创建了一个包含名为“ - ★ - 私 - ”的文件的zip文件,并将其解压缩:
with zipfile.ZipFile(zip_file_path, 'r') as zf:
zf.extractall(extract_dir)
这将“ - ★ - 私 - ”提取为“ - #U2605-#U79c1-”。 ZipInfo对象的文件名未编码,它只是包含输出文件名的常规ASCII字符串。
我想将包含Unicode代码点U-2605和U-79C1的字符串转换为有用的可输出Unicode字符串。所以我写了这个,但它没有正确转换字符:
string = codePoints.replace('#U', '\\u').encode('utf-8')
无论如何,我在哪里错了?如果我这样做,我得到的结果不一样:
string = '-\u2605-\u79c1-'.encode('utf-8')
(假设Python 3;在Python 2中,我会在前面的字符串前加上“u”字符。)
答案 0 :(得分:1)
我不确定这是否是您要找的:
>>> cp = '#U79c1'
>>> chr(int(cp[2:],16))
'私'
例如:
#! /usr/bin/python3
import re
def makeNice(s):
return re.subn('(#U[0-9a-f]{4})', lambda cp: chr(int(cp.groups()[0][2:],16)), s) [0]
a = '-#U2605-#U79c1-'
print(a, makeNice(a))
打印
-#U2605-#U79c1- -★-私-