python-3.x 如何解码转义的Unicode字符?

bq3bfh9z  于 2023-03-31  发布在  Python
关注(0)|答案(3)|浏览(163)

我正在尝试将转义Unicode字符替换为实际字符:

string = "\\u00c3\\u00a4"
print(string.encode().decode("unicode-escape"))

预期输出为ä,实际输出为ä

xdyibdwo

xdyibdwo1#

下面的解决方案似乎在类似的情况下工作(see for example this case about decoding broken Hebrew text):

("\\u00c3\\u00a4"
  .encode('latin-1')
  .decode('unicode_escape')
  .encode('latin-1')
  .decode('utf-8')
)

输出:

'ä'

其工作原理如下:

  • 只包含ASCII字符'\''u''0''0''c'等的字符串使用一些不太疯狂的8位编码转换为字节(只要正确处理ASCII字符,哪种编码都无所谓)
  • 使用解码器将'\u00c3'转义解释为unicode代码点U+00 C3(LATIN CAPITAL LETTER A WITH TILDE,'í')。从代码的Angular 来看,这是无意义的,但是这个unicode代码点在再次使用ISO-8859-1/'latin-1'编码时具有正确的字节表示,所以...
  • 'latin-1'重新编码
  • 这次将其“正确”解码为UTF-8

再次,与链接的帖子中相同的评论:在投入太多精力试图修复损坏的文本之前,您可能希望尝试修复以如此奇怪的方式进行编码的代码部分。* 首先不破坏它比破坏它然后再修复它要好。*

8iwquhpp

8iwquhpp2#

编解码器文档页说明

这意味着“unicode-escape”的输出将是latin 1,即使python的默认值是utf-8。
因此,您只需要编码回latin 1并解码回utf-8即可。

mixed_string_to_be_unescaped =  '\u002Fq:85\\u002FczM"},{\"name\":\"Santé\",\"parent_name\":\"Santé'

val = codecs.decode(mixed_string_to_be_unescaped, 'unicode-escape')
val = val.encode('latin1').decode('utf-8')
print(val)

/q:85/czM"},{"name":"Santé","parent_name":"Santé

上面的解决方案是有效的,但对我来说不清楚,因为我不明白为什么我应该在unicode_escape之前转换为latin-1(发现它会自动这样做),也不明白为什么它在未转义的字符串中使用unicode_escape。

gjmwrych

gjmwrych3#

我已经花了很长时间来理解这一点,所以在这里分享给潜在的未来读者。
这是其中一个推广的问题:正在解码转义Unicode字符,但这是非常特殊的情况。此处的原始字符串是以一种奇怪的方式创建的,可能经过了多次编码和解码。最终输出只是一个字符,其Unicode代码点为\u00E4。如果它在文件中存储为“\u00E4”,则可以使用“\u00E4”进行转换。encode('latin-1').decode('unicode_escape')
但在这里,它是utf-8代码点-2字节,这两个字节表示为转义的Unicode字符序列。

相关问题