UTF-8和os.listdir()

对于包含“ş”字符的文件(UTF-8中的\xC8\x99 – 下面的拉丁小写字母S),我遇到了一些麻烦。

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

这发生在我的OS X上,但它在Linux机器上工作。 任何想法究竟是什么导致了这种行为(两个环境configurationLANG = en_US.UTF8)?

这里是testing程序:

 #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" 

Solutions Collecting From Web of "UTF-8和os.listdir()"

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

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

这处理文件名为unicode ; 否则你需要首先解码字节串到unicode。

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