【问题标题】:Python: UnicodeEncodeError: 'latin-1' codec can't encode characters in position 3-4: ordinal not in range(256)Python:UnicodeEncodeError:“latin-1”编解码器无法编码位置 3-4 中的字符:序数不在范围内(256)
【发布时间】:2020-12-15 19:22:28
【问题描述】:

我找到了一个修复我的 mojibake 的站点,here,它使用了 python 包 ftfy。我尝试重现给定的步骤,尽管它似乎在运行它给我的步骤之前预先转换了字符串。

我要修复的字符串是 EvðŸ’👸ðŸ»,尽管该网站似乎在尝试使用与下面相同的步骤修复它之前将其预先转换为 EvðŸâ\x80\x99Â\x9dðŸâ\x80\x98¸ðŸÂ\x8f»

我的问题是,在运行 fix_broken_unicode 函数之前,我怎样才能让我的字符串处于与站点相同的状态,以避免我面临的错误?

运行我的脚本时,(可能是因为我没有进行预转换)我收到:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 3-4: ordinal not in range(256)

上述网站的源代码可以在:https://github.com/simonw/ftfy-web/blob/master/ftfy_app.py 找到,虽然因为我主要是 C++ 开发人员,所以我看不懂。

我的脚本:

import ftfy.bad_codecs 

def fix_broken_unicode(string):
    string = string.encode('latin-1')
    string = string.decode('utf-8')
    string = string.encode('sloppy-windows-1252')
    string = string.decode('utf-8')
    return string
    
print(fix_broken_unicode("EvðŸ’👸ðŸ»"))

自回答以来的更新:

我的输入:"EvðŸ’👸ðŸ»",预期结果:Ev????????????

【问题讨论】:

    标签: python unicode character-encoding ftfy


    【解决方案1】:

    您的数据字符串可能缺少一些不可打印的字符:

    >>> s = 'EvðŸ’\x9d👸ðŸ\x8f»'  # \x9d and \x8f aren't printable.
    >>> print(s)                    # This looks like your mojibake.
    EvðŸ’👸ðŸ»
    >>> s.encode('mbcs').decode('utf8')
    'Ev???'
    

    请注意,Python 的 mbcs 编解码器对应于 Windows 默认的 ANSI 编解码器。 仅当Windows-1252 是我正在运行的默认 ANSI 编解码器(美国和西欧本地化版本的 Windows)时,它才匹配“sloppy-windows1252”。

    另一个选项是您的原始 UTF-8 数据使用.decode('cp1252',errors='ignore') 解码。如果是这种情况,则两个字节丢失并且字符串不可逆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-07
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多