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

85

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

Joeforker
источник
21
Ты храбрый воин. Юникод - это заклятый враг питона.
Дэвид Бергер
2
Люди, которые это обнаружат, могут быть заинтересованы в том, как лучше всего убрать акценты в строке Unicode Python?
Мартин Тома

Ответы:

89

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/

Joeforker
источник
3
Хм .. немецкие умляуты преобразуются в их основной иероглиф вместо, например, ö = oe, ä = ae и т. Д.
ThiefMaster
4
@ThiefMaster Верны ли эти эквиваленты на всех языках? Возможно, Unidecode стремится к наименьшему общему знаменателю.
Марк Рэнсом
Unidecode, безусловно, предлагает независимое от языка решение. Для решения, ориентированного на немецкий язык, конвертируйте соответствующие символы вручную ( s/ö/oe/и т. Д.), Прежде чем очистить остальные с помощью unidecode.
Alexis
4
Действительно, на финском языке, например, в то время как ä -> a, ö -> oоткровенная неправильно, это все же предпочтительнее aeиoe
Антти Haapala
25

В своем первоначальном ответе я также предложил 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для работы с этими символами.

Майк Спросс
источник
21

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

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

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
мольберт
источник
3

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

Эндрю Далке
источник