【问题标题】:Part of string is UTF8 encoded, can't decode部分字符串为 UTF8 编码,无法解码
【发布时间】:2020-10-22 04:27:41
【问题描述】:

我正在解析一个文件,其中有一些 utf8 编码的文本以及普通文本,例如 -

str = "Name: \xE1\x83\x92\xE1\x83\x90\xE1\x83\x9B\xE1\x83\x90\xE1\x83\xA0\xE1\x83\xAF\xE1\x83\x9D\xE1\x83\x91\xE1\x83\x90"

我已经用utf8编码open("TEXT.txt", "r", encoding="utf8")打开了文件

我希望 print(str) 结果是Name: გამარჯობა

我已经尝试过再次编码和解码,它给了我预期的奇怪结果。另外,我不能用str.decode() 完全解码它,因为它显然已经解码了。

【问题讨论】:

  • 什么是“普通”文本?哪种编码?
  • 它是 unicode 格式

标签: python parsing encoding codec


【解决方案1】:

通过编码为'latin-1'获取字节,然后解码为UTF-8,可以将字符串转换为期望值:

>>> s = "Name: \xE1\x83\x92\xE1\x83\x90\xE1\x83\x9B\xE1\x83\x90\xE1\x83\xA0\xE1\x83\xAF\xE1\x83\x9D\xE1\x83\x91\xE1\x83\x90"
>>> s.encode('latin-1').decode('utf-8')
'Name: გამარჯობა'

如果你使用的是Python2,问题中的字符串是期望字符串的repr

>>> s = 'Name: გამარჯობა'
>>> s
'Name: \xe1\x83\x92\xe1\x83\x90\xe1\x83\x9b\xe1\x83\x90\xe1\x83\xa0\xe1\x83\xaf\xe1\x83\x9d\xe1\x83\x91\xe1\x83\x90'

并且可以直接从 UTF-8 解码为 un​​icode(假设 UTF-8 是 Python 2 解释器的默认编码):

>>> s = "Name: \xE1\x83\x92\xE1\x83\x90\xE1\x83\x9B\xE1\x83\x90\xE1\x83\xA0\xE1\x83\xAF\xE1\x83\x9D\xE1\x83\x91\xE1\x83\x90"
>>> s.decode('utf-8')
u'Name: \u10d2\u10d0\u10db\u10d0\u10e0\u10ef\u10dd\u10d1\u10d0'
>>> print s.decode('utf-8')
Name: გამარჯობა

【讨论】:

  • 感谢您的详细回复,我尝试了第一种方法(编码然后解码),但我得到了有趣的字符,例如“Ã、Ã、¢ 和方块”。我正在使用python 3,它不允许解码这样的字符串(因为它已经“解码”了)
  • @Zuss 你能编辑你的问题以显示文件中的原始字节吗?
猜你喜欢
  • 2017-04-14
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多