我目前正在尝试使屏幕阅读器在Becky! Internet Mail上更好地工作。我面临的问题与那里的列表视图有关。该控件不支持Unicode,但项目是自定义绘制在屏幕上的,因此当有人查看它时,不管编码如何,所有字段的内容都可以。通过MSAA或UIA访问时,使用为非Unicode程序设置的代码页编码的基本ANSI字符和邮件文本正确,而使用Unicode编码的邮件则文本正确。例如文字
Zażółćgęśląjaźń
以:表示
Zażółćgęśląjaźń
似乎应该可以使用WideCharToMultiByte将其从宽字符重新编码为系统编码,但是在尝试此操作之前,我想问一问在纯Python中是否可行?
该解决方案需要在Python 2和3中都可以使用。
目前,我只是用适当的表示形式替换这些字符的已知组合,但这并不是一个很好的解决方案,因为包含替换和替换字符的列表需要使用每个新发现的字符进行更新。
您的utf-8解码为cp1250。
我在python3中所做的是这样:
orig = "Zażółć gęślą jaźń"
wrong = "Zażółć gęślą jaźń"
for enc in range(437, 1300):
try:
res = orig.encode().decode(f"cp{enc}")
if res == wrong:
print('FOUND', res, enc)
except:
pass
...结果是1250代码页。
所以您的解决方案应该是:
import sys
def restore(garbaged):
if sys.version_info.major > 3:
return garbaged.encode('cp1250').decode()
else:
try:
return garbaged.decode('utf-8').encode('cp1250')
except:
return garbaged.encode('cp1250')