Где находится база данных Python "лучший ASCII для этого Unicode"?
У меня есть текст, который использует пунктуацию Unicode, например, левую двойную кавычку, правую одинарную кавычку для Апострофа и т. д., И мне это нужно в ASCII. Есть ли у Python база данных этих символов с очевидными заменителями ASCII, поэтому я могу сделать лучше, чем превратить их все в "?"?
4 ответа:
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/
в моем первоначальном ответе, я также предложил
unicodedata.normalize
. Однако я решил проверить его, и оказалось, что он не работает с кавычками Unicode. Он хорошо переводит акцентированные символы Юникода, поэтому я предполагаюunicodedata.normalize
реализуется с помощьюunicode.decomposition
функция, которая заставляет меня полагать, что она, вероятно, может обрабатывать только символы Юникода, которые являются комбинациями буквы и диакритического знака, но я на самом деле не эксперт по спецификации Юникода, поэтому я мог бы просто быть полный горячего воздуха...в любом случае, вы можете использовать
unicode.translate
чтобы иметь дело с знаками препинания вместо этого. Элементtranslate
метод принимает словарь ординалов Юникода к ординалам Юникода, таким образом, вы можете создать сопоставление, которое переводит только Юникод пунктуацию в 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. Если вы do нужно обрабатывать ударения и другие диакритические знаки, вы все еще можете использовать
unicodedata.normalize
чтобы иметь дело с этими символами.
интересный вопрос.
Google помог мне найти на этой странице который описывает с помощью модуль unicodedata следующим образом:
import unicodedata unicodedata.normalize('NFKD', title).encode('ascii','ignore')
есть дополнительная дискуссия об этом в http://code.activestate.com/recipes/251871/ который имеет решение NFKD и некоторые способы выполнения таблицы преобразования, для таких вещей, как ± => +/- и других нелуквенных символов.