从 python 中的 utf-8 编码字符串中删除文字反斜杠
Removing literal backslashes from utf-8 encoded strings in python
我有一堆包含UTF-8编码符号的字符串,例如'\u00f0\u009f\u0098\u0086'
。
在那种情况下,它代表这个表情符号 </code>,以 UTF-8 编码。我希望能够将其替换为文字表情符号。有人向我推荐的解决方案是将其编码为<code>latin-1
,然后将其解码为utf-8
。所以,
'\u00f0\u009f\u0098\u0086'.encode('latin-1').decode('utf-8')
给我输出
''
不幸的是,所有带有这些代码的字符串都有一个文字反斜杠,所以每当我做同样的操作时,
'\u00f0\u009f\u0098\u0086'.encode('latin-1').decode('utf-8')
我得到以下结果,
'\u00f0\u009f\u0098\u0086'
有没有办法删除那些反斜杠?因为如果我用空字符串替换它们,所有反斜杠都会消失。
我不知道您是从哪里得到该字符串的,但这是一种……不寻常的……表示代码点的方式。 U+1F606 带张嘴和 TIGHTLY-CLOSED 眼睛的笑脸在 UTF-8 中编码为字节 F0 9F 98 86
。在 Python 字符串转义中,\uXXXX
用于表示基本多语言平面中的整个代码点,\UXXXXXXXX
代码点超出它(像这个),而不是其 UTF- 的单个字节8编码。所以你希望看到它在字符串中表示为 '\U0001F606'
无论如何,下面将提取每个转义序列的最后两位十六进制数字,将它们变成一个字节数组,然后将得到的UTF-8数据解码成一个字符串:
import re
str='\u00f0\u009f\u0098\u0086'
print(b''.join([ bytes.fromhex(m.group(1)) for m in re.finditer(r'\u[0-9a-fA-F]{2}([0-9a-fA-F]{2})', str) ]).decode())
# Displays
我有一堆包含UTF-8编码符号的字符串,例如'\u00f0\u009f\u0098\u0086'
。
在那种情况下,它代表这个表情符号 </code>,以 UTF-8 编码。我希望能够将其替换为文字表情符号。有人向我推荐的解决方案是将其编码为<code>latin-1
,然后将其解码为utf-8
。所以,
'\u00f0\u009f\u0098\u0086'.encode('latin-1').decode('utf-8')
给我输出
''
不幸的是,所有带有这些代码的字符串都有一个文字反斜杠,所以每当我做同样的操作时,
'\u00f0\u009f\u0098\u0086'.encode('latin-1').decode('utf-8')
我得到以下结果,
'\u00f0\u009f\u0098\u0086'
有没有办法删除那些反斜杠?因为如果我用空字符串替换它们,所有反斜杠都会消失。
我不知道您是从哪里得到该字符串的,但这是一种……不寻常的……表示代码点的方式。 U+1F606 带张嘴和 TIGHTLY-CLOSED 眼睛的笑脸在 UTF-8 中编码为字节 F0 9F 98 86
。在 Python 字符串转义中,\uXXXX
用于表示基本多语言平面中的整个代码点,\UXXXXXXXX
代码点超出它(像这个),而不是其 UTF- 的单个字节8编码。所以你希望看到它在字符串中表示为 '\U0001F606'
无论如何,下面将提取每个转义序列的最后两位十六进制数字,将它们变成一个字节数组,然后将得到的UTF-8数据解码成一个字符串:
import re
str='\u00f0\u009f\u0098\u0086'
print(b''.join([ bytes.fromhex(m.group(1)) for m in re.finditer(r'\u[0-9a-fA-F]{2}([0-9a-fA-F]{2})', str) ]).decode())
# Displays