【问题标题】:Transform ascii to unicode将 ascii 转换为 unicode
【发布时间】:2017-05-12 14:03:22
【问题描述】:

我无法转换

'Schutzt\xc3\xbcren'.encode("utf-8")

以下为 unicode,但不能,得到错误

UnicodeDecodeError:“ascii”编解码器无法解码位置 7 中的字节 0xc3:序数不在范围内 (128)

我想得到

'Schutztüren'

结果。

【问题讨论】:

  • 哎呀,''Schutzt\xc3\xbcren'' 不是 ASCII! ASCII 代码必须在 1-127 范围内。它是 'Schutztüren' 的 utf-8 编码字节字符串。在相同的想法中,您将 unicode 字符串编码为具有编码的字节字符串,并将字节字符串解码为 un​​icode 字符串。
  • @SergeBallesta:我有包含这些字符串的元组,这些元组是我使用.to_csv 保存到磁盘的 DataFrame 中的单元格。我得到了这些丑陋的字符串。如何以良好的格式将它们放在磁盘上?
  • @Make42,切换到 Python3,然后将 encoding="utf8" 都添加到 df.to_csv() 和当您读取文件时。一切都会好起来的。
  • @alexis:不能。目前的公司政策。
  • 看到你的其他消息,我很同情。在那里查看我的回复。

标签: python utf-8


【解决方案1】:

您的字符串已经在utf-8 中。您需要将其解码为 Unicode,以便在 Python 中使用它:

print 'Schutzt\xc3\xbcren'.decode("utf-8")

但是你有一个更大的问题:你显然在使用 Python 2。立即切换到 Python 3,没有理由让自己发疯去尝试理解 Python 2 处理字符编码的方法。切换到 Python 3,您将不必每天用头撞桌子几次。 (请注意,虽然您调用了encode() 方法,但您得到了 UnicodeDecodeError。

简单解释:

  • 在 Python 中,unicode 和 utf-8 是不同的东西。 Python 2 中的str 可能采用"utf-8" 编码,unicode 对象没有编码。
  • 如果您尝试将 str 用于需要 unicode 的东西(例如,将其转换为 encode()),或者反之亦然,Python 2 将首先尝试隐式转换它。除了它不知道你的字符串的编码,所以它猜测(ascii,在你的情况下)。糟糕。
  • Python2 有很多隐式转换。

但实际上原因很简单:您没有使用 Python 3。

编辑:由于 Python 3 不是一个选项,这里有一些实用的建议:

  1. Unicode sandwich:将所有文本在读入后立即转换为 Unicode,使用 unicode 字符串并编码回 utf8 str 以再次将其写出。

    李>
  2. Pandas 仍应支持 to_csv() 的 encoding 参数,即使在 Python 2 上也是如此。使用它在 utf8 中写入文件。

  3. 要直接读取文件,请使用codecs.open() 而不是普通的open() 来读取文件。它接受encoding= 参数并为您提供unicode 字符串。

【讨论】:

  • 当然,我很愿意,但是……目前公司政策。
  • 哎哟......你正处于一个受伤的世界。如果是新项目,请尝试"unicode sandwich" 方法(阅读后立即将所有内容转换为unicode,仅在写入文件时转换回str)。
  • 自 1999 年以来我一直在使用 Python2,现在仍然每天都在使用它,而且我从不觉得有必要“用头撞背”。 Python2“处理字符编码的方法”实际上并不复杂——除非你当然不知道 unicode、字节字符串和编码,但是 Python3 将无济于事。
  • @bruno,那是因为你从 1999 年就开始使用它了! :-) 当然,如果您已经知道它,它会很好地工作。但是,当 Python 3 可用时,现在绕开这个问题,是无用的痛苦。如果您不知道的话,Python 3 会提供很多的帮助。我教这些东西,所以我从经验中这么说。 Python 2 版本不值得费心教给初学者——并且扩展到任何人,除非他们别无选择。
【解决方案2】:

您需要使用decode utf-8 编码的字符串来代替unicode。

'Schutzt\xc3\xbcren'.decode("utf-8")

【讨论】:

  • 成功了。您能解释一下您是如何得出这个解决方案的吗?
  • 'Schutzt\xc3\xbcren'.decode("utf-8") 结果为 u'Schutzt\xfcren' - 所以不适合我。
  • 更详细地解释一下,utf-8 是一种用于存储 unicode 字符的编码。通常一个 unicode 字符由 2 个字节组成,即 16 位。传统上,ascii 字符过去是由单字节存储和表示的。所以utf-8是一种允许unicode字符分别存储在两个单独的字节中,然后组合起来渲染成unicode字符的编码。
  • @Make42:它有效。 '\xfc' 是 'ü' 的 unicode 代码,或 unicode 表示法 U+00FC。 print 'Schutzt\xc3\xbcren'.decode("utf-8") 应该给出正确的输出(如果您的终端配置正确)。
  • @SergeBallesta 你能否让我知道如何配置终端来解决这个问题。我也遇到这个问题很久了。
【解决方案3】:

在 python 3 中,您需要 decode 和 bytes,它们是您的编码字符串:

b'Schutzt\xc3\xbcren'.decode("utf-8")

在 python 2 中,b 不是必需的(这里字节和字符串之间的区别不那么严格......)。

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 2013-05-17
    • 2020-02-20
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多