前言
最近在图形用户界面(GUI)自动化的工作,有一个场景是使用pyatspi
库和OCR工具获取GUI上的UI元素信息(元素名、元素类型和元素坐标等等),运行过程中发现了一些元素名包含了不可见字符,一个例子是:(\ueaf0),输出到powershell的效果大概是一个小方框:
但是保存为
.log
日志文件之后,在VSCode中打开,会发现VSCode把文件的编码模式自动识别成了:Window 1252
,导致变成了乱码,看到的效果是这样的:
显然这个字符并不是重要信息,因此我的解决方案是把字符串变量中所有不可见字符都过滤掉(替换为空格),保证powershell和日志文件中不会出现乱码。
解决方案
为了实施对字符串的过滤,首先是找到需要对哪个字符串进行过滤,这里debug一下,倒是不难找,顺便看了一下字符串的值,大概是这样的:
1
...\t\t\ueaf0\n19\tstatic...
由于在debug的时候,看到的字符串的值实际是原始值,因此不可见字符是以转义字符的形式展示的,也就是这里的\ueaf0
。
那么思路就比较清晰了:
- 将字符串转化为原始字符串,这里可以使用
repr(str)
函数直接进行转换; - 使用正则表达式匹配不可见字符,并替换。替换的规则写的比较粗暴,
r"\\u.{4}"
,意思是匹配\uxxxx
,也就是u后面跟四个字符,即标准的unicode字符,\\
是因为在原始字符串中匹配,需要转义; - 将原始字符串转化为正常字符串,直接用
import ast ast.literal_eval(raw_str)
函数。
大致的代码如下:
1
2
3
4
5
6
import re
import ast
origin_str # 原始的字符串
raw_str = repr(origin_str) # 转化为原始字符串
clean_raw_str = re.sub(r"\\u.{4}", "", raw_str) # 这里正则匹配写的比较粗暴,但是有效,
clean_str = ast.literal_eval(clean_raw_str)