【问题标题】:can not decoed using utf-8 after encoding with utf-8使用 utf-8 编码后无法使用 utf-8 解码
【发布时间】:2021-03-22 17:18:07
【问题描述】:

在某种情况下,我不得不将数据存储为 utf-8,而现在当我想获取和 decode('utf-8') 数据时,它根本不起作用。以下面的行为例:

\x0d\x0a\xd8\xb3\xd8\xa7\xd9\x82\xdb\x8c\xe2\x80\x8c\xd9\x86\xd8\xa7\xd9\x85\xd9\x87

您可以简单地复制下面的行,将上面的字符串转换为人类可读的格式:

b"\x0d\x0a\xd8\xb3\xd8\xa7\xd9\x82\xdb\x8c\xe2\x80\x8c\xd9\x86\xd8\xa7\xd9\x85\xd9\x87".decode("utf-8")

但是找不到将字符串转换为bytestring 而不损坏字符串的方法。我尝试了以下方法,但都失败了:

.decode("utf-8")
.decode()
.bytes()

到目前为止,我无法在操作系统或其他地方找到解决方案。感谢任何帮助。

【问题讨论】:

  • print("\x0d\x0a\xd8\xb3\xd8\xa7\xd9\x82\xdb\x8c\xe2\x80\x8c\xd9\x86\xd8\xa7\xd9\x85\xd9\x87".encode("latin1").decode()) 返回 ˙ساقی‌نامه˙(我不明白,抱歉)。
  • @JosefZ 这是正确的答案。但我不明白为什么 latin1 ,我的意思是你解码的字符串是 farsi/persian 为什么是 latin1?你能否告诉我你是如何发现latin1 是正确的编码?请将此作为答案,以便我可以接受此作为答案。谢谢,您保存了 30.000 条数据记录

标签: python-3.x utf-8 decode


【解决方案1】:
x0d\x0a\xd8\xb3\xd8\xa7\xd9\x82\xdb\x8c\xe2\x80\x8c\xd9\x86\xd8\xa7\xd9\x85\xd9\x87
b'x0d\x0a\xd8\xb3\xd8\xa7\xd9\x82\xdb\x8c\xe2\x80\x8c\xd9\x86\xd8\xa7\xd9\x85\xd9\x87'

以上几行(都在问题中给出)是String and Bytes literals(分别)的特定实例:

\xhh 具有十六进制值的字符hh (2, 3)


2 与标准 C 不同,正好两个十六进制数字是 需要

3 在字节文字中,十六进制和八进制转义表示 具有给定值的字节。 在字符串文字中,这些转义 表示具有给定值的 Unicode 字符


让我们检查以这种方式定义的字符串(在 Python 提示符内):

>>> xstr = "\x0d\x0a\xd8\xb3\xd8\xa7\xd9\x82\xdb\x8c\xe2\x80\x8c\xd9\x86\xd8\xa7\xd9\x85\xd9\x87"
>>> xstr
'\r\nساÙ\x82Û\x8câ\x80\x8cÙ\x86اÙ\x85Ù\x87'
>>> print( xstr)

ساÙÛâÙØ§Ù
Ù
>>>

显然,print( xstr) 输出与任何已知语言中的单词都不相似,但其所有字符(根据定义)属于 Unicode 范围 r'[\u0000-\u00ff]' 即 Unicode 中的前 256 个字符,瞧 - 它是 iso-8859-1又名'latin1'

我们需要获取xstr 字符串的编码版本作为字节对象,例如使用str.encode 方法或内置bytes() 函数。那么

print( bytes(xstr,'latin1').decode()); print(xstr.encode("latin1").decode())
ساقی‌نامه

ساقی‌نامه

【讨论】:

  • @JsefZ 感谢您的易懂描述。有一个问题,这个解决方案在本地运行良好,但在服务器上我仍然在终端中得到utf-8。会出什么问题?
  • 终于找到路了print(xstr.encode("latin1").decode('latin1'))我不知道为什么我也必须和latin1一起做decode
  • @iliya 您对 OQ 中的字符串来源有点简短。请用更详细的minimal reproducible example 提出另一个问题。
  • 是的,当然。还是谢谢。
猜你喜欢
  • 2021-05-14
  • 2011-01-01
  • 2012-11-07
  • 2014-01-24
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2012-11-01
  • 2017-03-15
相关资源
最近更新 更多