首页 > 解决方案 > Python - 为什么 unicode 不会死?

问题描述

我被迫使用 python 2.7,最近又出现了似乎坚不可摧的 unicode 错误。我以为我已经通过创建以下方法解决了这个问题,该方法工作了几个月没有问题,但最近出现了各种 unicode 错误:

def kill_unicode(s):
    if not isinstance(s, (int, np.integer)) and not isinstance(s, (float, np.float)):
        s = s.encode('unicode_escape', errors='replace').decode('utf-8')
    return(s)

但是,当我将其应用于最近的新数据时,我不断收到标准的 unicode 错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 542: ordinal not in range(128)

请注意,这不限于 0xc3。关于如何改进上述功能使其更通用的任何想法?请注意,忽略该值并完全从字符串中删除字符不是一个可行的选择,尽管用 unicode \x03 语法替换它是可行的。

更新:

你的建议还是不行。下面仍然提供 ASCII 错误。

def kill_unicode(s):
    if isinstance(s, str) or isinstance(s, bytes):
        s = s.encode('unicode_escape', errors='replace').decode('utf-8')
    return(s)

标签: pythonunicode

解决方案


应该死的是 ASCII,而不是 Unicode。

问题是你没有检查它s实际上是一个 Unicode 实例开始 - 如果它是一个字节串,在 2.7 中,当你调用encode它时,它会首先尝试使用 ASCII 编码进行解码。

isinstance(s, str)如果是真的,你应该只做这些。如果您进行该检查,那么您现有的检查 s 不是 int 或 float - 正如 FHTMichell 指出的那样,这是一个奇怪的选择 - 就变得不必要了。


推荐阅读