【问题标题】:How to convert "\uxxxx\uxxxx" to u'\Uxxxxxxxx'?如何将 "\uxxxx\uxxxx" 转换为 u'\Uxxxxxxxx'?
【发布时间】:2017-02-16 07:01:56
【问题描述】:

我有一个用 unicode 字符填充为 "\ud83d\udca5" 的文本文件,但 python 似乎不喜欢它们。
但是如果我用u'\U0001f4a5' 替换它,这似乎是他的python 逃逸风格(Charbase),它就可以工作。

有没有办法将它们全部转换成python无法理解的u"\Uxxxxxxxx"转义格式?

谢谢。

【问题讨论】:

  • 那是因为那是 UTF-16,而不是 UTF-8。
  • @Joey:这不是(全部)重点。 Unicode 对象和编码字节序列(由 UTF-16、UTF-8 或其他编码)之间存在根本区别。
  • 是的,我想是的,但我在 UTF-8 文件中有 UTF-16 字符。这就是问题所在。
  • @TimPietzcker:我的评论主要提到“我在 UTF-8 文件中有这些东西,但它不能正常工作”
  • 你的意思是你有一个包含文字反斜杠和字母“u”的文件吗?如果是这样,您需要弄清楚它是什么格式并为此使用合适的解析器。例如,它可能是 JSON。

标签: python python-3.x unicode escaping unicode-escapes


【解决方案1】:

您混淆了 Unicode 和编码字符串。 u'\U0001f4a5' 是一个 Unicode 对象,Python 用于处理字符串的内部数据类型。 (在 Python 3 中,u 是可选的,因为现在 所有 字符串都是 Unicode 对象)。

另一方面,文件使用编码。 UTF-8 是最常见的一种,但它只是将 Unicode 对象存储在面向字节的文件或流中的一种方式。打开此类文件时,您需要指定编码,以便 Python 可以将字节转换为有意义的 Unicode 对象。

在您的情况下,您似乎需要使用UTF-16 编解码器而不是UTF-8 打开文件。

with open("myfile.txt", encoding="utf-16") as f:
    s = f.read()

如果编解码器实际上是UTF-16,将为您提供正确的内容。如果看起来不正确,请尝试"utf-16-le""utf-16-be"

【讨论】:

  • 好吧,我试过了,但是当我用utf-16 打开文件时,我有:UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 9526-9527: illegal UTF-16 surrogate。与utf-16-be 相同,我可以使用utf-8 打开它,但会出现\uxxxx\uxxxx 问题。
  • 那么它完全使用了不同的编码。不幸的是,没有办法可靠地确定该编码 - 您需要检查文件的来源。您可以发布文件的相关示例吗?
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多