Python字符串编码:HTTP传输额外反斜杠的成因及去除方案
关于HTTP传输中Python字符串额外反斜杠的问题
嘿,这个问题我之前处理过好多次,本质是双重转义搞的鬼,我给你掰扯清楚:
一、额外反斜杠的作用是什么?
你发送的"\u062c\u0646\u062f\u064a\u0651\u0627"是Python里的Unicode转义序列,Python本身会把它解析成对应的阿拉伯语字符。但在HTTP传输过程中,如果发送端的序列化逻辑出了问题(比如重复调用了JSON序列化,或者手动把字符串的字面量直接发出去),原本的反斜杠\会被再次转义成\\——这时候额外的反斜杠的作用就是告诉接收端:我这里的\是一个普通字符,不是Unicode转义的起始标记。
简单说,原本的\u062c是“转义成对应Unicode字符”的指令,而变成\\u062c后,就成了“一个反斜杠字符 + u062c这几个普通字符”,完全失去了转义的意义。
二、如何去除这些额外反斜杠?
分两种场景处理,优先从发送端解决,不行再在接收端处理:
场景1:修改发送端(推荐)
额外反斜杠大多是因为发送端做了重复序列化导致的。比如:
- 如果你用
json.dumps()把字符串转成JSON,之后又不小心再转了一次,就会出现双重转义。 - 或者你直接把带转义的字符串字面量(而不是解析后的Unicode字符)发出去了。
解决办法:
- 确保只做一次JSON序列化:如果你的内容已经是Unicode字符(比如直接是
"جنديّا"),直接用json.dumps()序列化一次再发送。 - 如果发送前是转义字符串,先把它解析成Unicode字符再序列化:比如先用
ast.literal_eval()或者unicode-escape解码,再序列化。
场景2:在接收端处理
如果没法修改发送端,就在接收端把双重转义的字符串转回来,这里有几种靠谱的方法:
方法1:用ast.literal_eval()
这个方法会安全地解析Python字符串字面量,把转义序列还原:
import ast received_str = '\\u062c\\u0646\\u062f\\u064a\\u0651\\u0627' correct_str = ast.literal_eval(f'"{received_str}"') print(correct_str) # 输出:جنديّا
方法2:用json.loads()
JSON的解析逻辑会自动处理转义序列,把双重转义还原:
import json received_str = '\\u062c\\u0646\\u062f\\u064a\\u0651\\u0627' correct_str = json.loads(f'"{received_str}"') print(correct_str) # 输出:جنديّا
方法3:用unicode-escape解码
直接把字符串按Unicode转义规则解码:
received_str = '\\u062c\\u0646\\u062f\\u064a\\u0651\\u0627' correct_str = received_str.encode('utf-8').decode('unicode-escape') print(correct_str) # 输出:جنديّا
注意:如果接收的是完整的JSON对象(而不是单独的字符串),直接用
json.loads()解析整个对象就行,不用单独处理字符串。
内容的提问来源于stack exchange,提问作者A_Matar
相关产品推荐
相关产品推荐

