UTF-8和os.listdir()

Unk*_*own 2 python linux macos utf-8

我对包含"ş"字符的文件有一点麻烦(这是\xC8\x99UTF-8 - 带有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"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

OS X文件系统大多采用分解的字符,而不是他们的相结合的形式.您需要将文件名规范化为NFC组合规范化形式:

import unicodedata
files = [unicodedata.normalize('NFC', f) for f in os.listdir(u'.')]
Run Code Online (Sandbox Code Playgroud)

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

另请参阅unicodedata.normalize()功能文档.