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

Python 将Unicode字符串转换为UTF-8,然后转换为JSON,python,json,unicode,utf-8,escaping,Python,Json,Unicode,Utf 8,Escaping,我想用UTF-8编码一个字符串,并分别查看相应的UTF-8字节。在Python REPL中,以下内容似乎可以正常工作: >>> unicode('©', 'utf-8').encode('utf-8') '\xc2\xa9' 请注意,我在这里使用的是一个示例。“\xC2\xA9”看起来很像我想要的东西——一个由两个独立的代码点组成的字符串:U+00C2和U+00A9。(UTF-8解码时,返回原始字符串,'\xA9') 然后,我希望将UTF-8编码的字符串转换为与JSON兼容的

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

>>> unicode('©', 'utf-8').encode('utf-8')
'\xc2\xa9'
请注意,我在这里使用的是一个示例。
“\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”
?我觉得我遗漏了一些明显的东西-没有内置的方法来实现这一点吗?

如果您真的想将
“\u00c2\u00a9”
作为输出,请将
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”
作为输出,但我还不确定如何生成该输出。

注意:在测试此类内容时,这会带来额外的混乱。这种说法在许多层面上都是错误的。UTF-8是一种编码。Unicode更像是一个将数字(代码点)映射到符号的数据库。然后这些数字被UTF-8等编码使用。的确,与许多其他编码不同,UTF-8能够对任何Unicode符号进行编码/解码——但这并不意味着UTF-8是Unicode。这意味着一件事——将“Unicode”转换为“UTF-8”毫无意义。@PavelRadzivilovsky确实如此。否则,我们为什么需要UTF-8编码器/解码器呢?因为内部字符串表示可能不是UTF-8。例如,python上的UTF-16。我希望将
u'\u00A9'
作为输入(因此,与第一个示例不同),并将
'\u00c2\u00A9'
作为输出。一种较短的方法似乎是
json.dumps(unicodeString.encode('utf8').decode('latin1'))
@MathiasBynens,我认为Unicode的前256个代码点完全对应于拉丁文1,因此您的简短版本是正确的。非常聪明。是的,这是@nedbat的一个建议。它适用于所有Unicode代码点(就像您建议的解决方案一样)。例如,使用Unicode destring=u'\U0001D306'进行尝试会得到与之匹配的
“\u00f0\u009d\u008c\u0086”