【问题标题】:Python misinterprets 3 character string as UTF-8 continuation bytePython 将 3 个字符串误解为 UTF-8 连续字节
【发布时间】:2019-08-16 22:09:59
【问题描述】:

在将 Pandas 数据集保存到 Excel 时,我遇到了

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe6 in position 0: invalid continuation byte

一些挖掘表明我可以将 3 个 ascii 字符放在一起,生成的字符串似乎以 UTF-8 连续字节开头。显然字符串中没有多字节字符。克服这个问题的最佳方法是什么,以便我的所有数据都被解释为 ASCII 字符?

这是演示延续字节如何表现的 Python 代码

Python 3.7.1 (default, Dec 14 2018, 13:28:58)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> string_from_3_ascii_chars = chr(50) + chr(51) + chr(48)
>>> print(string_from_3_ascii_chars)
230
>>> print(string_from_3_ascii_chars.startswith(str(0xe6)))
True
>>>

【问题讨论】:

  • str(0xe6)'230'(一个包含三个字符的字符串)——与 chr(0xe6) 不同,后者是 '\xe6''æ'(一个包含一个字符的字符串)——同样不是与 byte 0xe6 相同,就像在字节字符串 b'\xe6' 中一样。
  • x.startswith('230') 为真当且仅当x 以字符'2''3''0' 开头。但这与最初提到的 UnicodeDecodeError 完全无关。而且,Python不会将 3 个字符的字符串误解为连续字节。
  • @MrLister 错误消息表明 UTF-8 解码器期望下一个字节是连续字节(二进制 10XXXXXX),但它遇到了 E611100110)。在保存操作中发生这种情况是相当奇怪的(您宁愿期待 编码 错误,而不是解码问题),但这并非不可能。
  • @lenz 是的,但错误还说“在位置 0”,这是不能出现连续字节的地方。
  • @MrLister 哦,好点。事实上你是对的:错误信息可以用b'\xe6a'.decode('utf8')来重现

标签: python pandas unicode utf-8


【解决方案1】:

在有问题的示例中,str(0xe6) 采用整数 0xe6230 十进制表示法)并在其上调用 repr(object)。这将产生字符串'230'string_from_3_ascii_chars 确实以 '230' 开头。 startswith通过返回True来确认这一点。

【讨论】:

  • “startswith 函数总是将字符串作为参数”是正确的,但“当传递一个整数时,它会转换它”是不正确的。 startswith 不会自动将其参数转换为字符串,它会为错误的参数类型生成 error。您通过调用 str(0xe6) 手动将 0xe6 转换为字符串
  • @TS 好的,我会考虑如何改写这个问题。挑战在于为所有 cmets 保留上下文。
【解决方案2】:

可以通过分离编码器并用您的 ascii 编码器替换。

  • 创建一个以 Latin-1/ascii 编码方式编码的示例文件。
  • 使用“utf-8”编码打开文件
  • 分离编码并替换为“Latin-1/ascii”
  • 读取文件

注意:此方法更改文件权限。因此您将能够读取但不能写入文件。

with open("/Desktop/temp/junk1",'wb') as f: 
    s="Hello Jalapeño".encode("latin-1") 
    f.write(s)
with open("/Desktop/temp/junk1",'r') as f: 
    b=f.detach()
    f=io.TextIOWrapper(b,"latin-1") 
    print(f.read())

`

【讨论】:

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