Python如何正确打印包含Unicode转义字符的字符串
问题解答
为什么两种场景处理结果存在差异
两种场景的输出差异和print()函数本身无关,核心原因是两个场景下传入print()的字符串内容本质不同:
- 代码中写的字符串字面量
"Le Condamn\u00e9 \u00e0 mort"里的\u开头序列是Python语法规定的Unicode转义标识,会在代码编译阶段就被Python解释器自动转换为对应的Unicode字符,你传给print()的本身就是已经完成转义的é、à字符,自然输出正常。 - 从stdin或者文件读取到的字符串,是输入源的原始字符序列,
\u00e9会被拆成\、u、0、0、e、9六个独立字符存储,解释器不会自动对外部输入的内容做转义解析,print()只是原样输出收到的字符,因此会显示未转义的原始内容。
转义处理方法
最安全通用的方案是利用Python内置的unicode_escape编码完成转义解析,步骤是先把原始字符串按latin-1编码转为字节串(latin-1是单字节编码,每个字节直接对应Unicode前256个码点,不会丢失字符也不会出现编码错误),再用unicode_escape编码解码为正常字符串,示例代码如下:
import sys # 从stdin读取原始字符串 raw_input = sys.stdin.readline().strip() # 转义处理 processed_str = raw_input.encode('latin-1').decode('unicode_escape') # 输出转义后的结果 print(processed_str)
注意事项
- 不要使用
eval()类方法处理输入字符串,存在极高的代码注入安全风险,一旦输入包含恶意代码会直接被执行。 - 如果输入字符串是符合JSON规范的内容,也可以用
json.loads()处理,注意需要给字符串包裹双引号匹配JSON语法:import json; processed_str = json.loads(f'"{raw_input}"'),该方案仅适用于符合JSON格式要求的输入。
内容的提问来源于stack exchange,提问作者user2418063
相关产品推荐
相关产品推荐

