【问题标题】:Convert Unicode string to UTF-8, and then to JSON将 Unicode 字符串转换为 UTF-8,然后再转换为 JSON
【发布时间】:2013-06-19 19:25:47
【问题描述】:

我想用 UTF-8 编码一个字符串并单独查看相应的 UTF-8 字节。在 Python REPL 中,以下似乎工作正常:

>>> unicode('©', 'utf-8').encode('utf-8')
'\xc2\xa9'

请注意,我在这里使用U+00A9 COPYRIGHT SIGN 作为示例。 '\xC2\xA9' 看起来很接近我想要的——一个由两个单独的代码点组成的字符串:U+00C2 和 U+00A9。 (当 UTF-8 解码时,它会返回原始字符串,'\xA9'。)

然后,我希望将 UTF-8 编码的字符串转换为与 JSON 兼容的字符串。但是,以下似乎没有做我想要的:

>>> import json; json.dumps('\xc2\xa9')
'"\\u00a9"'

请注意,它会生成一个包含 U+00A9(原始符号)的字符串。相反,我需要 UTF-8 编码的字符串,它在有效 JSON 中看起来像 "\u00C2\u00A9"

TL;DR 如何在 Python 中将 '©' 转换为 "\u00C2\u00A9"?我觉得我遗漏了一些明显的东西——有没有内置的方法可以做到这一点?

【问题讨论】:

  • 注意: The results of using print in the Python REPL depend on the $LANG environment variable. 这在测试这样的东西时会带来额外的混乱。
  • 这种说法在很多层面上都是错误的。 UTF-8 是一种编码。 Unicode 更像是一个将数字(代码点)映射到符号的数据库。然后这些数字被 UTF-8 等编码使用。确实,与许多其他编码不同,UTF-8 能够编码/解码任何 Unicode 符号——但这并不意味着 UTF-8 Unicode。
  • 这意味着一件事——将“unicode”转换为“utf-8”没有任何意义。
  • @PavelRadzivilovsky 当然可以。否则,我们为什么需要 UTF-8 编码器/解码器?
  • 您拥有它们是因为内部字符串表示可能不是 UTF-8。例如,python 上的 UTF-16。

标签: python json unicode utf-8 escaping


【解决方案1】:

如果你真的想要 "\u00c2\u00a9" 作为输出,给 json 一个 Unicode 字符串作为输入。

>>> print json.dumps(u'\xc2\xa9')
"\u00c2\u00a9"

您可以从原始字节生成此 Unicode 字符串:

s = unicode('©', 'utf-8').encode('utf-8')
s2 = u''.join(unichr(ord(c)) for c in s)

我认为您真正想要的是 "\xc2\xa9" 作为输出,但我还不确定如何生成它。

【讨论】:

  • 我想要u'\u00A9' 作为输入(所以,不像你的第一个例子),'"\u00c2\u00a9"' 作为输出。
  • 一个更短的方法似乎是json.dumps(unicodeString.encode('utf8').decode('latin1'))
  • @MathiasBynens,我认为 Unicode 的前 256 个代码点与 latin1 完全对应,因此您的简短版本是正确的。非常聪明。
  • 是的——这是@nedbat 的建议,Pragmatic Unicode 成名。它适用于所有 Unicode 代码点(就像您建议的解决方案一样)。例如。用unicodeString = u'\U0001D306' 尝试得到"\u00f0\u009d\u008c\u0086",它与the UTF-8 representation for U+1D306 匹配。
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2019-10-16
  • 2021-07-06
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多