gpt4 book ai didi

python - 编码期间出现 UnicodeDecodeError?

转载 作者:行者123 更新时间:2023-11-28 19:56:54 26 4
gpt4 key购买 nike

我们遇到了一个问题(描述为 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,因此我们不确定如何继续。

发生的一个非常可怕的 hack 是编写我们自己的 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() 构造函数时得到这个!!!

我相信上述维基文章 http://wiki.python.org/moin/UnicodeDecodeError 中描述了根本原因.从第二段往下阅读如何“矛盾的是,UnicodeDecodeError 可能会在编码...时发生”。 Wiki 文章非常准确地描述了我们正在经历的事情——但是虽然它详细说明了原因,但没有提出解决方案的建议。

事实上,第三段以以下令人震惊的承认开始“与 UnicodeEncodeError 的类似情况不同,这种失败总是不可避免的......”

由于我作为开发人员不习惯“无法从这里获取”信息,所以我认为有兴趣在 Stack Overflow 上了解一下其他人的经验。

最佳答案

我认为您混淆了 Unicode 字符串和 Unicode 编码(如 UTF-8)。

os.walk(".") 返回文件名(和目录名等)作为当前代码页中编码的字符串。它会默默地删除您当前代码页 (see this question for a striking example) 中不存在的字符。

因此,如果您的文件/目录名称包含编码范围之外的字符,那么您肯定需要使用 Unicode 字符串来指定起始目录,例如通过调用 os.walk(u".") 。然后您不再需要(也不应该)对结果调用 unicode(),因为它们已经 Unicode 字符串。

如果你不这样做,你首先需要解码文件名(如mystring.decode("cp850")),这会给你一个Unicode字符串:

>>> "\xab".decode("cp850")
u'\xbd'

然后您可以将其编码为 UTF-8 或任何其他编码。

>>> _.encode("utf-8")
'\xc2\xbd'

如果您仍然对为什么 unicode("\xab") 抛出一个解码错误感到困惑,也许下面的解释会有所帮助:

"\xab" 是一个编码 字符串。 Python 无法知道那是哪种编码,但在将其转换为 Unicode 之前,需要先对其进行解码。如果没有您的任何说明,unicode() 假定它是用 ASCII 编码的,并且当它尝试在此假设下对其进行解码时,它会失败,因为 \xab 不是ASCII 的一部分。因此,您要么需要找出您的文件系统正在使用哪种编码并调用 unicode("\xab", encoding="cp850") 或其他任何方式,要么首先从 Unicode 字符串开始。

关于python - 编码期间出现 UnicodeDecodeError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16918063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com