编码过程中是否出现UnicodeDecodeError?

2024-06-16 11:25:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我们遇到了一个问题(描述为http://wiki.python.org/moin/UnicodeDecodeError)--请阅读第二段“…自相矛盾的…”。

具体来说,我们正在尝试将字符串向上转换为unicode,并且收到UnicodedeCoderror。

示例:

   >>> 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描述了根本原因。从第二段往下读,自相矛盾的是,当编码..“时,可能会发生单一的decodeerror。Wiki文章非常准确地描述了我们正在经历的事情——但是虽然它详细阐述了cuas,但是它没有对解决方案提出建议。

事实上,第三段以以下惊人的承认开始:“与UnicodeEncodeError的类似案例不同,这种失败总是无法避免的……”。

作为一个开发人员,我不习惯于“从这里无法获得”信息,所以我想我有兴趣在Stack Overflow上讨论一下其他人的经验。


Tags: 字符串代码inorghttp示例mostfor