Как нормализовать кодировку Юникод для преобразования iso-8859-15 в python?
Я хочу конвертировать строку Unicode в ISO-8859-15. Эти строки включают в себя u"\u2019"
(ПРАВИЛЬНАЯ ОДНОКВАЖНАЯ КВАРТИРА, см. http://www.fileformat.info/info/unicode/char/2019/index.htm) символ, который не является частью набора символов iso-8859-15.
В Python, как нормализовать символы юникода, чтобы соответствовать кодировке iso-8859-15?
Я посмотрел на модуль unicodedata без успеха. Мне удается делать работу с
s.replace(u"\u2019", "'").encode('iso-8859-15')
но я бы хотел найти более общий и понятный способ.
Спасибо за вашу помощь
3 ответа
Используйте версию Unicode translate
функция, предполагая s
является строкой Unicode:
s.translate({ord(u"\u2019"):ord(u"'")})
Аргумент версии Unicode translate
является диктом, отображающим ординалы юникода в ординалы юникода. Добавьте к этому диктату другие символы, которые вы не можете кодировать в своей целевой кодировке.
Вы можете построить свою таблицу сопоставления в немного более удобочитаемой форме и создать из нее свой формат сопоставления, например:
char_mappings = [(u"\u2019", u"'"),
(u"`", u"'")]
translate_mapping = {ord(k):ord(v) for k,v in char_mappings}
Из перевода документации:
Для объектов Unicode метод translate() не принимает необязательный аргумент deletechars. Вместо этого он возвращает копию s, в которой все символы были отображены через заданную таблицу перевода, которая должна быть отображением ординалов Unicode в ординалы Unicode, строки Unicode или None. Несопоставленные символы остаются нетронутыми. Символы, сопоставленные с None, удаляются. Обратите внимание, что более гибкий подход заключается в создании пользовательского кодека сопоставления символов с помощью модуля кодеков (см. Пример в encodings.cp1251).
Если вы не хотите создавать правило перевода (если вы это делаете, посмотрите на ответ Боуда), вы можете выбрать один из обработчиков ошибок по умолчанию. encode
предоставляет или даже зарегистрирует свой собственный:
In [4]: u'\u2019 Hi'.encode('iso-8859-15', 'replace')
Out[4]: '? Hi'
In [5]: u'\u2019 Hi'.encode('iso-8859-15', 'ignore')
Out[5]: ' Hi'
In [6]: u'\u2019 Hi'.encode('iso-8859-15', 'xmlcharrefreplace')
Out[6]: '’ Hi'
От encode
строка документации:
S.encode ([кодирование [, ошибки]]) -> строка или юникод
Кодирует S, используя кодек, зарегистрированный для кодирования. по умолчанию используется кодировка по умолчанию. ошибки могут быть заданы для установки другой схемы обработки ошибок. По умолчанию это "строгий", что означает, что ошибки кодирования вызывают ошибку UnicodeEncodeError. Другими возможными значениями являются "игнорировать", "заменить" и "xmlcharrefreplace", а также любое другое имя, зарегистрированное в codecs.register_error, которое может обрабатывать ошибки UnicodeEncodeErrors.
Для информации, мое окончательное решение:
iso885915_utf_map = {
u"\u2019": u"'",
u"\u2018": u"'",
u"\u201c": u'"',
u"\u201d": u'"',
}
utf_map = dict([(ord(k), ord(v)) for k,v in iso885915_utf_map.items()])
s.translate(utf_map).encode('iso-8859-15')
Спасибо за помощь