Python:将Unicode代码点文件名转换为字符串

时间:2014-01-06 20:50:42

标签: python unicode winrar

我正在使用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”字符。)

1 个答案:

答案 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- -★-私-