You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:07