Python处理UTF 8 文本中的不可见字符的方法

Posted on 2025-01-22

前言

最近在图形用户界面(GUI)自动化的工作,有一个场景是使用pyatspi库和OCR工具获取GUI上的UI元素信息(元素名、元素类型和元素坐标等等),运行过程中发现了一些元素名包含了不可见字符,一个例子是:(\ueaf0),输出到powershell的效果大概是一个小方框: alt text 但是保存为.log日志文件之后,在VSCode中打开,会发现VSCode把文件的编码模式自动识别成了:Window 1252,导致变成了乱码,看到的效果是这样的: alt text

显然这个字符并不是重要信息,因此我的解决方案是把字符串变量中所有不可见字符都过滤掉(替换为空格),保证powershell和日志文件中不会出现乱码。

解决方案

为了实施对字符串的过滤,首先是找到需要对哪个字符串进行过滤,这里debug一下,倒是不难找,顺便看了一下字符串的值,大概是这样的:

1
...\t\t\ueaf0\n19\tstatic...

由于在debug的时候,看到的字符串的值实际是原始值,因此不可见字符是以转义字符的形式展示的,也就是这里的\ueaf0

那么思路就比较清晰了:

  1. 将字符串转化为原始字符串,这里可以使用repr(str)函数直接进行转换;
  2. 使用正则表达式匹配不可见字符,并替换。替换的规则写的比较粗暴,r"\\u.{4}",意思是匹配\uxxxx,也就是u后面跟四个字符,即标准的unicode字符,\\是因为在原始字符串中匹配,需要转义;
  3. 将原始字符串转化为正常字符串,直接用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)