我有一个应用程序需要能够处理未知编码的非ASCII字符。程序可能会删除或替换这些字符(如果它们在用户词典文件中被发现),否则它们需要通过不变的方式通过。什么是令人难以置信的,它工作一分钟,然后我做了一些看似微不足道的改变,现在它失败了UnicodeDecode,UnicodeEncode或类似的错误。解决这个问题让我走上了货运崇拜计划的道路 - 随意调整让它再次运作,但我不知道为什么。有没有一个通用的解决方案来处理这个问题,甚至可能创建修改Python处理字符串的正常方法的类?
我不确定要包含哪些代码,因为涉及五个单独的模块。以下是我用抽象术语做的事情:
从两个来源之一获取文本:用户已直接粘贴到Tkinter顶层窗口的文本;通过热键命令从Win32剪贴板捕获的文本。
处理文本,包括删除空格章程,然后根据可自定义的用户词典替换或简单删除某些字符/单词。
然后将结果返回到Tkinter GUI或Win32剪贴板,具体取决于是否使用了键盘快捷键。
可能相关的一些细节:
所有模块都使用
# -*- coding: utf-8 -*-
用户词典以带BOM的UTF-16 LE保存(一个函数在解析文件时删除BOM字符)。文件对象用
实例化self.pf = codecs.open(self.pattern_fn, 'r', 'utf-16')
文本的文本入口点是通过Tkinter GUI Text小部件:
text = self.paste_to_field.get(1.0, Tkinter.END)
或者来自剪贴板:
text = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
示例错误:
File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u201d' in position
2: character maps to <undefined>
此外,在OS X(我在开发工作中)进行测试时,相同的文本可能会起作用,但在Windows上会导致错误。
使用正则表达式,但在这种情况下,模式中不包含非ASCII。对于非ASCII,我只是
text = text.replace(old, new)
要考虑的另一件事是:对于文本类型中的c迭代并不好,因为非ASCII可能看起来像Python的几个字符。正常的单词/字符区别不再成立。此外,使用bad_letter = repr(non_ASCII)没有帮助,因为str(bad_letter)只返回转义序列的字符串 - 它无法恢复原始字符。
很抱歉,如果这非常模糊。请让我知道我可以提供哪些信息来帮助澄清。提前感谢您阅读本文。