Python写入当前窗口标题到文件的编码及base64转换报错问题求解
问题解决方法
错误原因
- 第一个
UnicodeEncodeError错误:Windows系统默认写入文件使用GBK/CP1252等区域编码,无法编码窗口标题中包含的\u200e(左到右标记)这类Unicode特殊字符,指定UTF-8编码写入是正确的解决逻辑。 - 第二个
ValueError错误:base64是字节编码协议,仅接收字节类型输入,你直接将读取到的含非ASCII字符的Unicode字符串传入base64编码方法才会报错,和使用UTF-8写入文件无关。
可行方案
方案1:正确适配base64编码流程(保留完整窗口标题,推荐)
不需要修改写入文件的逻辑,仅调整base64编解码的调用方式即可,流程为:字符串转UTF-8字节→base64编码→解码为ASCII格式的base64字符串;还原时反向操作即可。
修改后的完整参考代码:
import win32gui import time import psutil import win32process import base64 i = 0 while i <= 1: time.sleep(2) w = win32gui q = w.GetWindowText(w.GetForegroundWindow()) q = str(q) print(q) pid = win32process.GetWindowThreadProcessId(w.GetForegroundWindow()) print(psutil.Process(pid[-1]).name()) # 写入文件保留原编码 with open("lolp.txt", 'w', encoding='utf-8') as f: f.write(q) # 读文件并做base64编码,无报错 with open("lolp.txt", 'r', encoding='utf-8') as f: content = f.read() # 先转utf-8字节再做base64编码 b64_encoded = base64.b64encode(content.encode('utf-8')).decode('ascii') print("base64编码结果:", b64_encoded) # 还原原始内容 original_content = base64.b64decode(b64_encoded).decode('utf-8') print("还原后的窗口标题:", original_content) i += 1
方案2:过滤非ASCII字符(无需UTF-8编码,丢失特殊字符)
如果不需要保留完整的特殊字符,可以在获取窗口标题后直接过滤非ASCII内容,后续不管写入文件还是base64编码都不会报错:
q = w.GetWindowText(w.GetForegroundWindow()) # 用?替换无法编码为ASCII的字符,也可将replace改为ignore直接删除 q = q.encode('ascii', errors='replace').decode('ascii') # 后续写入无需指定encoding参数,直接转base64也不会报错 with open("lolp.txt", 'w') as f: f.write(q) b64_encoded = base64.b64encode(q.encode('ascii')).decode('ascii')
方案3:简单加密存储
你之前用的ROT13属于简单位移加密,安全性极低,如果需要更高的安全性同时方便解密,可以直接将UTF-8编码后的窗口标题字节做异或加密,或者直接使用base64编码结果作为简单混淆方案,比ROT13安全性更高,加解密逻辑也更简单。
注意:MD5是不可逆哈希算法,无法还原原始内容,不适合用于需要解密的加密场景。
内容的提问来源于stack exchange,提问作者Augurkenplukker12
相关产品推荐
相关产品推荐

