UTF-8和os.listdir()

时间:2014-11-04 10:36:27

标签: python linux macos utf-8

我在使用包含“ş”字符的文件时遇到了一些麻烦(在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"

1 个答案:

答案 0 :(得分:8)

OS X filesystem mostly uses decomposed characters而不是他们的组合形式。您需要将文件名规范化为NFC组合规范化形式:

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

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

另见unicodedata.normalize() function documentation