首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:将Unicode代码点文件名转换为字符串

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

Stack Overflow用户
提问于 2014-01-06 20:50:42
回答 1查看 1K关注 0票数 0

我使用Python的zipfile模块来提取.zip文件,它可以包含带有Unicode文件名的文件。WinZip和7-Zip存档工作正常,但WinRAR对文件名的编码略有不同。假设我创建了一个zip文件,其中包含一个名为"-★-私-“的文件,并使用以下方式解压它:

代码语言:javascript
复制
with zipfile.ZipFile(zip_file_path, 'r') as zf:
    zf.extractall(extract_dir)

它将"-★-私-“提取为”#U 2605-#U79c1-“。ZipInfo对象的文件名不是编码的,它只是一个包含输出文件名的常规ASCII字符串。

我想将包含Unicode代码点U-2605和U-79C1的字符串转换为有用的、可输出的Unicode字符串。所以我写了这个,但是它不能正确地转换字符:

代码语言:javascript
复制
string = codePoints.replace('#U', '\\u').encode('utf-8')

不管怎么说,我哪里错了?如果我这么做了,我就不会得到同样的结果了:

代码语言:javascript
复制
string = '-\u2605-\u79c1-'.encode('utf-8')

(假设Python 3;在Python 2中,我会以"u“字符作为前面的字符串的前缀。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-06 20:55:25

我不知道这是不是你想要的:

代码语言:javascript
复制
>>> cp = '#U79c1'
>>> chr(int(cp[2:],16))
'私'

例如:

代码语言:javascript
复制
#! /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))

版画

代码语言:javascript
复制
-#U2605-#U79c1- -★-私-
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20959022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档