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

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

Ответ 1

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/

Ответ 2

В моем первоначальном ответе я также предложил unicodedata.normalize. Тем не менее, я решил проверить его, и выясняется, что он не работает с кавычками Unicode. Он отлично выполняет перевод символов с акцентом Unicode, поэтому я предполагаю, что unicodedata.normalize реализуется с помощью функции unicode.decomposition, что заставляет меня думать, что, вероятно, он может обрабатывать только символы Юникода, которые являются комбинациями буквы и диакритической метки, но я не являюсь экспертом по спецификации 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 для обработки этих символов.

Ответ 3

Интересный вопрос.

Google помог мне найти эту страницу, которая описывает использование unicodedata module следующим образом:

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')

Ответ 4

В дополнительном обсуждении этого вопроса http://code.activestate.com/recipes/251871/, который имеет решение NFKD и некоторые способы сделать таблицу преобразования, для таких вещей, как ± = > +/- и другие небуквенные символы.