Python 3.6,utf-8 到 unicode 的转换,带双反斜杠的字符串

Posted

技术标签:

【中文标题】Python 3.6,utf-8 到 unicode 的转换,带双反斜杠的字符串【英文标题】:Python 3.6, utf-8 to unicode conversion, string with double backslashes 【发布时间】:2018-09-20 05:12:50 【问题描述】:

关于 utf-8 > unicode 转换有很多问题,但我的问题仍然没有找到答案。

让我们有这样的字符串:

a = "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"

Python 3.6 像 Je-li pro za\xc5\x99azov\xc3\xa1n\xc3\xad 一样理解这个字符串。我需要将此类似 utf-8 的字符串转换为 unicode 表示。最终结果应该是Je-li pro zařazování

a.decode("utf-8") 我得到 AttributeError: 'str' object has no attribute 'decode',因为 Python 意味着该对象已经解码。

如果我先用bytes(a, "utf-8") 将其转换为字节,则反斜杠只会加倍,.decode("utf-8") 再次将其返回到我当前的a

如何从 a 获取 unicode 字符串 Je-li pro zařazování

【问题讨论】:

this 没有帮助吗? (在你说“不,不是”之前,它不使用bytes(a,"utf-8"),你需要更好的解释。) 还有...为什么你有两个\s? how-do-i-un-escape-a-backslash-escaped-string-in-python 为什么有两个反斜杠...这是一个奇怪的 API 的结果,它返回一些解码的字符,而另一些则没有。 【参考方案1】:

你必须编码/解码 4 次才能得到想要的结果:

print(
  "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"

  # actually any encoding support printable ASCII would work, for example utf-8
  .encode('ascii')

  # unescape the string
  # source: https://***.com/a/1885197
  .decode('unicode-escape')

  # latin-1 also works, see https://***.com/q/7048745
  .encode('iso-8859-1')

  # finally
  .decode('utf-8')
)

Try it online!

此外,如果可以的话,考虑告诉您的目标程序(数据源)提供不同的输出格式(例如字节数组或 base64 编码)。

不安全但更短的方法:

st = "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"
print(eval("b'"+st+"'").decode('utf-8'))

Try it online!

ast.literal_eval,但这里可能不值得使用。

【讨论】:

以上是关于Python 3.6,utf-8 到 unicode 的转换,带双反斜杠的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.6:如何使用 unicode/utf-8 文件名保存文件? [关闭]

Python编码

Python初学--字符串

系统使用(Python2不支持的) Unicode UTF-8 字符导致 ArcGIS 运行崩毁

python学习之基础:编码

Python / Django 中的 Unicode 与 UTF-8 混淆?