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

Python调用netsh获取WiFi列表突发解码失败及编码适配求助

问题:获取WiFi列表时出现Unicode解码错误

背景

此前一直正常运行的WiFi列表获取代码突然报错:

result = subprocess.run("netsh wlan show network",
                        shell=True, stdout=subprocess.PIPE, 
                        text=True, encoding="gbk")

执行时抛出GBK解码错误:

Traceback (most recent call last):
  File "c:\Users\Administrator\Desktop\login_jxnu\auto_connect\utils.py", line 13, in get_wifi_list
    result = subprocess.run("netsh wlan show network",
  File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 507, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 1121, in communicate
    stdout = self.stdout.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 3918: illegal multibyte sequence

将编码改为utf-8后仍报错:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 3: invalid start byte

通过chcp命令查看系统编码,返回活动代码页: 936\n(对应GBK编码),使用环境为Windows 11 + Python 3.9。


后续测试结果

将编码改为utf-8后程序恢复正常,执行以下代码的输出如下:

res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE, text=True)
print(res.stdout)  # 输出:  Active code page: 65001

res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE, text=True, encoding='utf-8')
print(res.stdout)  # 输出:   Active code page: 65001

res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE, text=True, encoding='gbk')
print(res.stdout)  # 输出:  Active code page: 65001

result = subprocess.run("netsh wlan show network",
                        shell=True, stdout=subprocess.PIPE, 
                        text=True)
# 触发错误
Traceback (most recent call last):
  File "c:\Users\Administrator\Desktop\login_jxnu\try.py", line 4, in <module>
    result = subprocess.run("netsh wlan show network",
  File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 507, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "D:\development\anaconda\envs\deep-todo\lib\subprocess.py", line 1121, in communicate
    stdout = self.stdout.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xb5 in position 229: illegal multibyte sequence

# 省略text=True参数
res = subprocess.run("chcp", shell=True, stdout=subprocess.PIPE)
print(res.stdout)  # 输出:  b'Active code page: 65001\r\n'

核心疑问

  1. 为何原本正常的代码突然失效?
  2. 有哪些方法可以避免这类解码错误?

分析与解决方案

失效原因

  • WiFi名称含特殊字符:周边出现了名称包含GBK/UTF-8编码无法覆盖的字符(如生僻字、emoji、其他编码字符)的WiFi,导致netsh输出的字节流无法用单一编码完整解码。
  • 代码页切换:后续测试中chcp返回65001(UTF-8),说明当前控制台代码页被修改(可能由其他程序、系统更新或手动设置导致),但subprocess默认继承的编码与实际输出编码不匹配,引发解码冲突。

解决方法

  1. 读取字节流后兼容处理:不指定text=True和encoding,先获取原始字节数据,再尝试多种编码解码,忽略无效字符:
result = subprocess.run("netsh wlan show network",
                        shell=True, stdout=subprocess.PIPE)
# 优先尝试UTF-8,失败则用GBK,忽略无法解码的字符
try:
    output = result.stdout.decode('utf-8', errors='ignore')
except:
    output = result.stdout.decode('gbk', errors='ignore')
  1. 强制切换代码页到UTF-8:执行netsh前先切换控制台代码页为65001,确保输出为UTF-8编码:
# 先切换代码页到UTF-8,屏蔽输出避免干扰
subprocess.run("chcp 65001", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 用UTF-8编码读取netsh输出
result = subprocess.run("netsh wlan show network",
                        shell=True, stdout=subprocess.PIPE, 
                        text=True, encoding="utf-8")
  1. 替换无效字符而非忽略:如果不想丢失字符,用errors='replace'将无法解码的字节替换为占位符:
result = subprocess.run("netsh wlan show network",
                        shell=True, stdout=subprocess.PIPE, 
                        text=True, encoding="gbk", errors="replace")

内容的提问来源于stack exchange,提问作者idea steps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:53:12