Где находится «лучшая ASCII для этого Unicode» Python? - PullRequest
82 голосов
/ 03 мая 2009

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

Ответы [ 4 ]

87 голосов
/ 09 ноября 2009

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/

24 голосов
/ 03 мая 2009

В своем первоначальном ответе я также предложил unicodedata.normalize. Тем не менее, я решил проверить это, и оказалось, что он не работает с кавычками 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!"'

Вы можете добавить больше отображений знаков препинания, если это необходимо, но я не думаю, что вам обязательно нужно беспокоиться об обработке каждого знака препинания в Юникоде. Если вам do необходимо обрабатывать ударения и другие диакритические знаки, вы все равно можете использовать unicodedata.normalize для работы с этими символами.

19 голосов
/ 03 мая 2009

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

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

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
3 голосов
/ 01 сентября 2009

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

...