繁体   English   中英

UTF-8和os.listdir()

[英]UTF-8 and os.listdir()

我在使用包含“ş”字符的文件时遇到了一些麻烦(UTF-8中的\\xC8\\x99 - 带有COMMA的LATIN SMALL LETTER S)。

我正在创建一个ș.txt文件并尝试使用os.listdir()将其恢复。 不幸的是, os.listdir()将其返回为s\\xCC\\xA6 (“s”+ COMBINING COMMA BELOW),我的测试程序(如下)失败。

这发生在我的OS X上,但它适用于Linux机器。 知道究竟是什么导致了这种行为(两个环境都配置了LANG = en_US.UTF8)?

这是测试程序:

#coding: utf-8
import os

fname = "ș.txt"
with open(fname, "w") as f:
    f.write("hi")

files = os.listdir(".")
print "fname: ", fname
print "files: ", files

if fname in files:
    print "found"
else:
    print "not found"

OS X文件系统主要使用分解的字符而不是它们的组合形式。 您需要将文件名规范化为NFC组合规范化形式:

import unicodedata
files = [unicodedata.normalize('NFC', f) for f in os.listdir(u'.')]

这会将文件名作为unicode处理; 你需要先将字节串解码为unicode。

另请参阅unicodedata.normalize()函数文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM