我已經擴大了這一點的一些細節。
如果您確信數據庫中文本的編碼,則可以使用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