У меня есть текст, в котором используется пунктуация Unicode, например левая двойная кавычка, правая одинарная кавычка для апострофа и т. Д., И мне он нужен в ASCII. Есть ли в Python база данных этих символов с очевидными заменами ASCII, так что я могу сделать лучше, чем превращать их все в "?" ?
85
Ответы:
Unidecode выглядит как законченное решение. Он преобразует причудливые кавычки в кавычки ascii, латинские символы с диакритическими знаками в безударные и даже пытается транслитерировать символы, которые не имеют эквивалентов ASCII. Таким образом, вашим пользователям не нужно будет видеть кучу? когда вам приходилось передавать их текст через устаревшую 7-битную систему ascii.
>>> from unidecode import unidecode >>> print unidecode(u"\u5317\u4EB0") Bei Jing
http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/
источник
s/ö/oe/
и т. Д.), Прежде чем очистить остальные с помощьюunidecode
.ä -> a
,ö -> o
откровенная неправильно, это все же предпочтительнееae
иoe
В своем первоначальном ответе я также предложил
unicodedata.normalize
. Однако я решил проверить это, и оказалось, что он не работает с кавычками Unicode. Он отлично справляется с переводом акцентированных символов Unicode, поэтому я предполагаю, чтоunicodedata.normalize
он реализован с использованиемunicode.decomposition
функции, что заставляет меня думать, что он, вероятно, может обрабатывать только символы Unicode, которые представляют собой комбинации буквы и диакритического знака, но я не совсем эксперт по спецификациям Unicode, так что я мог бы просто болтать ...В любом случае вы можете использовать
unicode.translate
вместо них символы пунктуации. Этотtranslate
метод принимает словарь порядковых номеров Unicode в порядковые номера Unicode, поэтому вы можете создать отображение, которое переводит пунктуацию только Unicode в знаки препинания, совместимые с ASCII:'Maps left and right single and double quotation marks' 'into ASCII single and double quotation marks' >>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 } >>> teststring = u'\u201Chello, world!\u201D' >>> teststring.translate(punctuation).encode('ascii', 'ignore') '"hello, world!"'
При необходимости вы можете добавить больше сопоставлений пунктуации, но я не думаю, что вам обязательно нужно беспокоиться об обработке каждого отдельного символа пунктуации Unicode. Если вам действительно нужно обрабатывать акценты и другие диакритические знаки, вы все равно можете использовать их
unicodedata.normalize
для работы с этими символами.источник
Интересный вопрос.
Google помог мне найти эту страницу, которая описывает использование модуля unicodedata следующим образом:
import unicodedata unicodedata.normalize('NFKD', title).encode('ascii','ignore')
источник
Дополнительное обсуждение этого вопроса можно найти на http://code.activestate.com/recipes/251871/, где есть решение NFKD и некоторые способы создания таблицы преобразования для таких вещей, как ± => +/- и других небуквенных символов.
источник