Где находится база данных Python "лучший ASCII для этого Unicode"?


У меня есть текст, который использует пунктуацию Unicode, например, левую двойную кавычку, правую одинарную кавычку для Апострофа и т. д., И мне это нужно в ASCII. Есть ли у Python база данных этих символов с очевидными заменителями ASCII, поэтому я могу сделать лучше, чем превратить их все в "?"?

4 80

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 и некоторые способы выполнения таблицы преобразования, для таких вещей, как ± => +/- и других нелуквенных символов.