Python os.walk()umlauts u'\ u0308'

Tim*_*Tim 1 python unicode os.walk

我在OSX机器上运行Python 2.7.我正试图在smb上分享一个os.walk.

for root, dirnames, filenames in os.walk("./test"):
        for filename in filenames:

            print filename

            matchObj = re.match( r".*ö.*",filename,re.UNICODE)
Run Code Online (Sandbox Code Playgroud)

如果我使用上面的代码,只要文件名不包含变音符号就行.在我的shell中,变音符号被打印得很好但是当我将它们复制回utf8格式化的Textdeditor(在我的例子中是Sublime)时,我得到:

截图 预期:

filename.jpeg
filename_ö.jpg
Run Code Online (Sandbox Code Playgroud)

当然正则表达式失败了.如果我硬编码文件名,如:

re.match( r".*ö.*",'filename_ö',re.UNICODE)
Run Code Online (Sandbox Code Playgroud)

它工作正常.

我试过了:

os.walk(u"./test")
filename.decode('utf8')
Run Code Online (Sandbox Code Playgroud)

但是给了我:

return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0308' in position 10: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

u'\u0308' 是变音之上的圆点.

我猜想我会忽略一些愚蠢的东西?

dec*_*eze 6

Unicode字符可以以各种形式表示; 有"ö",但是也可以使用"o"和单独组合变音符来表示相同的角色.OS X通常更喜欢分离的变体,并且您的编辑器似乎没有优雅地处理它,这两个单独的字符也不匹配您的正则表达式.

如果您需要某种方式或另一种方法,则需要规范化 Unicode数据.见unicodedata.normalize.您想要NFC标准化表格.