Я расширил это немного подробнее.
Если вы достаточно уверены в кодировке текста в базе данных, вы можете сделать text.decode('cp1252')
, чтобы получить строку Unicode. Если предположение неверно, это, скорее всего, взорвется исключением, или декодер «пропадет» с некоторыми символами.
Создание декодера в соответствии с описанными вами линиями (изменение cp1252.py
) очень просто. Вам просто нужно определить таблицу перевода из байтов в символы Юникода.
Однако, если не весь текст в базе данных имеет одинаковую кодировку, вашему декодеру понадобятся некоторые правила, чтобы решить, какое отображение является правильным. В этом случае вы можете использовать команду punt и использовать *1001* модуль chardet , который может сканировать текст и угадывать кодировку.
Возможно, лучшим подходом будет попытка декодирования с использованием наиболее вероятной кодировки (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