Python读取WiFi SSID时UTF-8与Unicode编码异常问题
解决Python读取WiFi SSID时的Unicode转义问题
我之前也碰到过一模一样的问题!你看到的Ryan\xe2\x80\x99s iPhone其实是Unicode字符’的字节转义表示,根源在于你的代码直接处理了subprocess返回的字节流,而没有先解码成字符串,导致特殊字符无法正确解析。
问题分析
原代码中subprocess.check_output()返回的是bytes类型数据,当你用正则匹配时,会把Unicode字符的字节序列当成普通字符串转义处理,所以才会出现\xe2\x80\x99这种奇怪的输出。解决的核心就是先把字节流解码成UTF-8字符串,再进行后续操作。
修改后的完整代码
import subprocess import re # 执行WiFi扫描命令,捕获标准输出和错误输出 ps = subprocess.Popen(('sudo', 'iwlist', 'wlan0', 'scan'), stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = ps.communicate() # 关键:将字节输出解码为UTF-8字符串,处理特殊字符 output_str = stdout.decode('utf-8') # 提取所有SSID(现在是字符串层面的匹配,不会有转义问题) ssid_matches = re.findall(r'"([^"]*)"', output_str) # 去重、过滤空值并排序 unique_ssids = sorted(filter(None, dict.fromkeys(ssid_matches))) # 打印结果测试 for ssid in unique_ssids: print(ssid)
关键修改点说明
- 使用
communicate()替代管道直接传递:这是更安全的subprocess使用方式,同时能捕获错误输出(如果扫描命令出错可以排查) - 字节流解码:
stdout.decode('utf-8')把subprocess返回的字节数据转换成UTF-8字符串,这一步直接解决了特殊字符的转义问题,像’这类Unicode字符会被正确解析显示 - 后续操作都基于字符串:正则匹配、去重排序都在字符串层面完成,结果自然是正常的可读SSID
额外提示
如果你的系统默认编码不是UTF-8,可以尝试用locale.getpreferredencoding()获取系统编码来解码,但绝大多数Linux系统中iwlist的输出都是UTF-8编码,所以直接用utf-8基本没问题。
内容的提问来源于stack exchange,提问作者Ryan Bobrowski
相关产品推荐
相关产品推荐

