我得到一个包含Unicode字符的字符串。但是反斜杠已被转义。我想删除一个反斜杠,以便python可以正确处理Unicode。
使用replace
一次只能删除并添加两个反斜杠。
my_str = '\\uD83D\\uDE01\\n\\uD83D\\uDE01'
my_str2 = my_str.replace('\\', '')
'\\uD83D\\uDE01\\n\\uD83D\\uDE01'
应该是'\uD83D\uDE01\n\uD83D\uDE01'
编辑: 多谢您的回覆。你是对的,我的榜样错了。这是我尝试过的其他事情
my_str = '\\uD83D\\uDE01\\n\\uD83D\\uDE01'
my_str2 = my_str.replace('\\\\', '\\') # no unicode
my_str2 = my_str.replace('\\', '')
答案 0 :(得分:5)
那可能……可能行不通。 Escape characters are handled during lexical analysis (parsing),您的字符串中已经有 一个反斜杠,它只是该单个反斜杠的转义表示:
>>> r'\u3d5f'
'\\u3d5f'
您需要做的是encode the string to be "python source" then re-decode it while applying unicode escapes:
>>> my_str.encode('utf-8').decode('unicode_escape')
'\ud83d\ude01\n\ud83d\ude01'
但是请注意,这些代码点是surrogates,因此您的字符串几乎已损坏/无效,您将无法执行以下操作:打印它,因为UTF8编码器将拒绝它:
>>> print(my_str.encode('utf-8').decode('unicode_escape'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 0-1: surrogates not allowed
要解决此问题,您需要第二次修正:将编码编码为UTF-16 直接让代理人通过(使用“ surrogatepass”模式),然后将UTF-16正确解码回实际格式正确的字符串:
>>> print(my_str.encode('utf-8').decode('unicode_escape').encode('utf-16', 'surrogatepass').decode('utf-16'))
但是,您可能真的想对数据进行源分析,从逻辑上讲,在其中获取带有Unicode转义符的(unicode)字符串是无效的,这可能是不正确的JSON数据加载等。如果这是一个解决方案(我意识到并非总是如此),那么修复此问题要比事后进行hacky修复要好得多。