我在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)


如果我使用上面的代码,只要文件名不包含变音符号,它就可以工作。
在我的外壳中,变音符打印得很好,但是当我将它们复制回utf8格式的Textdeditor(在我的情况下为Sublime)时,我得到:

screenshot
预期:

filename.jpeg
filename_ö.jpg


当然,正则表达式失败了。
如果我像这样对文件名进行硬编码:

re.match( r".*ö.*",'filename_ö',re.UNICODE)


它工作正常。

我试过了:

os.walk(u"./test")
filename.decode('utf8')


但是给我:

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)


u'\u0308'是变音符号上方的点。

我正在忽略一些愚蠢的东西?

最佳答案

Unicode字符可以用多种形式表示;有“ö”,但也有可能使用“ o”和分开的组合变音符号来表示相同的字符。 OS X通常更喜欢使用分隔的变体,并且您的编辑器似乎不能很好地处理该变体,这两个独立的字符也不匹配您的正则表达式。

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

关于python - Python os.walk()变音u'\u0308',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33647067/

10-08 22:29