我在 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)
如果我使用上面的代码,只要文件名不包含变音符号,它就可以工作。在我的 shell 中,变音符号打印得很好,但是当我将它们复制回 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 规范化形式。
我是一名优秀的程序员,十分优秀!