我们遇到了一个问题(描述为http://wiki.python.org/moin/UnicodeDecodeError)——阅读第二段“......自相矛盾......”。
具体来说,我们正在尝试将字符串上转换为 unicode,并且我们收到了 UnicodeDecodeError。
例子:
>>> unicode('\xab')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 0: ordinal not in range(128)
但是,当然,这没有任何问题
>>> unicode(u'\xab')
u'\xab'
当然,这段代码是为了演示转换问题。在我们的实际代码中,我们没有使用字符串字面量,我们不能只在 unicode 'u' 前缀前面加上,而是处理从 os.walk() 返回的字符串,文件名包含上述值. 由于我们无法在不调用 unicode() 构造函数的情况下将值强制为 unicode,因此我们不确定如何继续。
发生的一个非常可怕的黑客攻击是编写我们自己的 str2uni() 方法,例如:
def str2uni(val):
r"""brute force coersion of str -> unicode"""
try:
return unicode(src)
except UnicodeDecodeError:
pass
res = u''
for ch in val:
res += unichr(ord(ch))
return res
但在我们这样做之前——想看看其他人是否有任何见解?
更新
我看到每个人都在关注我如何获得我发布的示例,而不是结果。叹息——好的,这是导致我花费数小时将问题简化为我上面分享的最简单形式的代码。
for _,_,files in os.walk('/path/to/folder'):
for fname in files:
filename = unicode(fname)
当文件名具有以下值 '3\xab Floppy (A).link' 时,该代码会抛出 UnicodeDecodeError 异常
要亲自查看错误,请执行以下操作:
>>> unicode('3\xab Floppy (A).link')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 1: ordinal not in range(128)
更新
我真的很感谢每个试图提供帮助的人。我也很欣赏大多数人犯了一些与字符串/unicode处理相关的非常简单的错误。但我想强调对UnicodeDecodeError异常的引用。我们在调用 unicode() 构造函数时得到了这个!!!
我相信前面提到的 Wiki 文章http://wiki.python.org/moin/UnicodeDecodeError中描述了根本原因。从第二段开始阅读“自相矛盾的是,编码时可能会发生 UnicodeDecodeError ...”。Wiki 文章非常准确地描述了我们正在经历的事情——但是虽然它详细说明了原因,但它没有对解决方案提出任何建议。
事实上,第三段开始于以下令人震惊的承认“与 UnicodeEncodeError 的类似情况不同,这种失败不能总是避免......”。
由于作为开发人员,我不习惯“无法从这里到达那里”的信息,因此我认为有兴趣在 Stack Overflow 上寻找其他人的经验。