我正在尝试将转义Unicode字符替换为实际字符:
string = "\\u00c3\\u00a4" print(string.encode().decode("unicode-escape"))
预期输出为ä,实际输出为ä。
ä
ä
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') )
输出:
'ä'
其工作原理如下:
'\'
'u'
'0'
'c'
'\u00c3'
ISO-8859-1
'latin-1'
再次,与链接的帖子中相同的评论:在投入太多精力试图修复损坏的文本之前,您可能希望尝试修复以如此奇怪的方式进行编码的代码部分。* 首先不破坏它比破坏它然后再修复它要好。*
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。
gjmwrych3#
我已经花了很长时间来理解这一点,所以在这里分享给潜在的未来读者。这是其中一个推广的问题:正在解码转义Unicode字符,但这是非常特殊的情况。此处的原始字符串是以一种奇怪的方式创建的,可能经过了多次编码和解码。最终输出只是一个字符,其Unicode代码点为\u00E4。如果它在文件中存储为“\u00E4”,则可以使用“\u00E4”进行转换。encode('latin-1').decode('unicode_escape')但在这里,它是utf-8代码点-2字节,这两个字节表示为转义的Unicode字符序列。
3条答案
按热度按时间xdyibdwo1#
下面的解决方案似乎在类似的情况下工作(see for example this case about decoding broken Hebrew text):
输出:
其工作原理如下:
'\'
、'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'
重新编码再次,与链接的帖子中相同的评论:在投入太多精力试图修复损坏的文本之前,您可能希望尝试修复以如此奇怪的方式进行编码的代码部分。* 首先不破坏它比破坏它然后再修复它要好。*
8iwquhpp2#
编解码器文档页说明:
这意味着“unicode-escape”的输出将是latin 1,即使python的默认值是utf-8。
因此,您只需要编码回latin 1并解码回utf-8即可。
上面的解决方案是有效的,但对我来说不清楚,因为我不明白为什么我应该在unicode_escape之前转换为latin-1(发现它会自动这样做),也不明白为什么它在未转义的字符串中使用unicode_escape。
gjmwrych3#
我已经花了很长时间来理解这一点,所以在这里分享给潜在的未来读者。
这是其中一个推广的问题:正在解码转义Unicode字符,但这是非常特殊的情况。此处的原始字符串是以一种奇怪的方式创建的,可能经过了多次编码和解码。最终输出只是一个字符,其Unicode代码点为\u00E4。如果它在文件中存储为“\u00E4”,则可以使用“\u00E4”进行转换。encode('latin-1').decode('unicode_escape')
但在这里,它是utf-8代码点-2字节,这两个字节表示为转义的Unicode字符序列。