我知道我之前在另一份工作上做过这件事,但我不记得我做了什么。
我有一个数据库,其中包含从Office,网页剪切和粘贴的varchar和备注字段,以及谁知道其他地方。这开始导致我的编码错误。由于Python有一个非常好的“解码”函数来获取字节流并将其转换为Unicode,我认为这只是编写我自己的编码来解决这个问题。 (例如,采用“智能引号”并将其转换为“标准引号”。)
但我不记得如何开始。我想我复制了一个关闭的编码(cp1252.py),然后更新了它。
有人能把我放在正确的道路上吗?或者建议一条更好的道路?
答案 0 :(得分:3)
我对此进行了更详细的介绍。
如果您有理由确定数据库中文本的编码,则可以text.decode('cp1252')
获取Unicode字符串。如果猜测错误,这可能会因异常而爆炸,或解码器将“消失”某些字符。
沿着您描述的行(修改cp1252.py
)创建解码器很容易。您只需要将转换表从字节定义为Unicode字符。
但是,如果并非数据库中的所有文本都具有相同的编码,则解码器将需要一些规则来确定哪个是正确的映射。在这种情况下,您可能需要使用chardet module,它可以扫描文本并猜测编码。
也许最好的方法是尝试使用最可能的编码(cp1252)进行解码,如果失败,则回退到使用chardet来猜测正确的编码。
如果使用text.decode()
和/或chardet,最终会得到一个Unicode字符串。下面是一个简单的例程,它可以转换Unicode字符串中的字符,例如“将曲线引号转换为ASCII”:
CHARMAP = [
(u'\u201c\u201d', '"'),
(u'\u2018\u2019', "'")
]
# replace with text.decode('cp1252') or chardet
text = u'\u201cit\u2019s probably going to work\u201d, he said'
_map = dict((c, r) for chars, r in CHARMAP for c in list(chars))
fixed = ''.join(_map.get(c, c) for c in text)
print fixed
输出:
"it's probably going to work", he said