【问题标题】:Printing strings with UTF-8 encoded characters, e.g.: "\u00c5\u009b\"打印带有 UTF-8 编码字符的字符串,例如:“\u00c5\u009b\”
【发布时间】:2026-02-02 16:15:01
【问题描述】:

我想打印这样编码的字符串:"Cze\u00c5\u009b\u00c4\u0087",但我不知道怎么做。示例字符串应打印为:“Cześć”。

我试过的是:

str = "Cze\u00c5\u009b\u00c4\u0087"
print(str) 
#gives: CzeÅÄ

str_bytes = str.encode("unicode_escape")
print(str_bytes) 
#gives: b'Cze\\xc5\\x9b\\xc4\\x87'

str = str_bytes.decode("utf8")
print(str) 
#gives: Cze\xc5\x9b\xc4\x87

在哪里

print(b"Cze\xc5\x9b\xc4\x87".decode("utf8"))

给出“Cześć”,但我不知道如何将 "Cze\xc5\x9b\xc4\x87" 字符串转换为 b"Cze\xc5\x9b\xc4\x87" 字节。

我也知道问题是在使用 "unicode_escape" 参数对基本字符串进行编码后,字节表示中的额外反斜杠,但我不知道如何摆脱它们 - str_bytes.replace(b'\\\\', b'\\') 不起作用。

【问题讨论】:

  • 关于你的最后一点,str_bytes = str_bytes.replace(b'\\\\', b'\\') 应该解决这个问题 - 你可能没有将它分配回变量。
  • @Ihay86 不幸的是它不起作用。它返回相同的字节列表。
  • 顺便说一句,不要使用 str 作为变量名,因为这会影响内置的 str 类型。
  • 真正的 问题是:为什么你有这样编码的字符串?理想情况下,它们应该固定在上游。您不应该将 UTF-8 字节编码为这样的文本字符串! Matias 的回答有效,另一种处理这种 mojibake 的方法是s.encode('latin1').decode('utf8')
  • 好的。这是一个已知问题,请参阅Facebook JSON badly encoded。在 Facebook 工作的 Martijn Pieters♦ 提交了一份内部错误报告。

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


【解决方案1】:

使用raw_unicode_escape:

text = 'Cze\u00c5\u009b\u00c4\u0087'
text_bytes = text.encode('raw_unicode_escape')
print(text_bytes.decode('utf8')) # outputs Cześć

【讨论】:

  • 这是 JSON 数据,他们应该将其解码为 JSON。当然,它也是一个 mojibake,但 raw_unicode_escape 在这里不是正确的工具,如果输入中有文字反斜杠后跟已知的 Python 转义序列(但 JSON 会忽略),可能会导致问题。