0

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

4

1 回答 1

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- -★-私-
于 2014-01-06T20:55:25.897 回答