Де знаходиться база даних "найкращого ASCII для цього Unicode" на Python?


85

У мене є текст, який використовує розділові знаки Unicode, такі як ліва подвійна лапка, права одинарна лапка для апострофа тощо, і мені це потрібно в ASCII. Чи є у Python база даних цих символів з очевидними замінниками ASCII, щоб я міг зробити краще, ніж перетворити їх усіх на "?" ?


21
Ти хоробрий воїн. Юнікод - це архнемезида пітона.
Девід Бергер,

Відповіді:


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/


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щоб мати справу з цими персонажами.



3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.