将Unicode字符串转换为UTF-8,然后转换为JSON。

3

我希望将一个字符串编码为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"
简而言之,如何在Python中将'©'转换为"\u00C2\u00A9"? 我觉得我可能错过了一些显而易见的东西 - 难道没有内置的方法可以实现这一点吗?

注意:在Python REPL中使用print的结果取决于$LANG环境变量。这会在测试此类内容时引入额外的混淆层面。 - Mathias Bynens
那个陈述在很多层面上都是错误的。UTF-8 是一种编码方式,而 Unicode 更像是将数字(代码点)映射到符号的数据库。这些数字随后由诸如 UTF-8 之类的编码方式使用。确实,与许多其他编码方式不同,UTF-8 能够编码/解码任何 Unicode 符号,但这并不意味着 UTF-8 就是 Unicode。 - Mathias Bynens
这意味着将“Unicode”转换为“UTF-8”没有任何意义。 - Pavel Radzivilovsky
当然有必要。否则,我们为什么需要UTF-8编码器/解码器呢? - Mathias Bynens
你会拥有它们,因为内部字符串表示可能与UTF-8不同。例如,在Python中可能是UTF-16。 - Pavel Radzivilovsky
1个回答

2
如果您真的想要输出"\u00c2\u00a9",请将Unicode字符串作为输入提供给json
>>> 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"' - Mathias Bynens
一个更简短的方法是 json.dumps(unicodeString.encode('utf8').decode('latin1')) - Mathias Bynens
@MathiasBynens,我认为Unicode的前256个字符恰好对应于“latin1”,因此你的简短版本是正确的。非常聪明。 - Mark Ransom
是的 - 这是 Pragmatic Unicode 的作者 @nedbat 提出的建议。它可以正确地处理所有 Unicode 代码点(就像您提出的解决方案一样)。例如,使用 unicodeString = u'\U0001D306' 尝试会得到 "\u00f0\u009d\u008c\u0086",这与 U+1D306 的 UTF-8 表示 相匹配。 - Mathias Bynens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接