Где Python & # 8220; лучший ASCII для этого Unicode & # 8221; база данных?

StackOverflow https://stackoverflow.com/questions/816285

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Unidecode выглядит как законченное решение. Он преобразует необычные кавычки в кавычки ascii, латинские символы с ударением в безударные и даже пытается транслитерировать, чтобы иметь дело с символами, которые не имеют эквивалентов ASCII. Таким образом, ваши пользователи не должны видеть кучу? когда вам нужно было передать их текст через устаревшую 7-битную систему ascii.

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing 

http://www.tablix.org/~avian / блог / архивы / 2009/01 / unicode_transliteration_in_python /

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top