Python中如何在每个十六进制字符前添加转义字符?
解决JSON转储时转义十六进制字符的问题
首先,你遇到的核心问题是混淆了字符串的实际内容和它的打印/表示形式。那些\x00、\x96并不是由\、x、0、0这些字符组成的字符串,而是单个的控制字符或扩展ASCII字符——直接用replace没成功,大概率是你替换的是字符串字面量"\x00",而非实际存在的那个特殊字符。
正确的手动替换方法
如果你的目标是把这些特殊字符替换成Python风格的转义字符串(比如把空字符\x00变成四个字符组成的\x00)再写入JSON,你需要直接针对实际字符进行替换:
import json # 示例原始字符串,包含\x00和\x96 original_str = "Hello\x00World\x96Test" # 替换目标字符:注意替换的是实际字符(比如'\x00'),而非字符串"\x00" processed_str = original_str.replace('\x00', '\\x00').replace('\x96', '\\x96') # 写入JSON文件 with open('output.json', 'w', encoding='utf-8') as f: json.dump({"content": processed_str}, f, indent=2)
运行后,JSON文件里的内容会是:
{ "content": "Hello\\x00World\\x96Test" }
这里的\\x00是JSON的标准转义方式——因为JSON中反斜杠本身需要转义,所以最终存储的是\x00的字面量。
注意:JSON规范的限制
要提醒你的是,JSON本身并不支持\xXX这种转义格式,它只认可\uXXXX的Unicode转义(比如\x00会被JSON自动转成\u0000)。如果你只是想让特殊字符在JSON中被正确转义(而非一定要\xXX格式),其实不需要手动替换,json.dump会自动处理:
import json original_str = "Hello\x00World\x96Test" with open('output.json', 'w', encoding='utf-8') as f: json.dump({"content": original_str}, f, indent=2)
输出的JSON会是符合规范的格式:
{ "content": "Hello\u0000World\u0096Test" }
这种格式能被所有标准JSON解析器正确识别。
批量替换所有十六进制控制字符
如果你有大量这类字符需要处理,手动逐个替换太麻烦,可以写一个函数批量转换:
import json def escape_hex_chars(s): result = [] for char in s: ord_char = ord(char) # 过滤掉打印字符,只转义控制字符和扩展ASCII if (ord_char <= 0x1F or ord_char >= 0x80) and ord_char not in (0x0A, 0x0D): result.append(f'\\x{ord_char:02x}') else: result.append(char) return ''.join(result) original_str = "Hello\x00World\x96Test\nAnother line" processed_str = escape_hex_chars(original_str) with open('output.json', 'w', encoding='utf-8') as f: json.dump({"content": processed_str}, f, indent=2)
这个函数会自动把所有非打印的ASCII控制字符、扩展ASCII字符转成\xXX格式,同时保留换行、回车这类常用格式字符。
内容的提问来源于stack exchange,提问作者Sagiv Mapgavker
相关产品推荐
相关产品推荐

