web-dev-qa-db-ja.com

Pythonの「このUnicodeに最適なASCII」データベースはどこにありますか?

左二重引用符、アポストロフィの右単一引用符など、Unicode句読点を使用するテキストがいくつかあり、ASCIIで必要です。 Pythonこれらの文字のデータベースには明らかなASCII置換があるので、それらをすべて「?」に変えるよりもうまくいくことができますか?

83
joeforker

nidecode は完全なソリューションのように見えます。派手な引用符をアスキー引用符に、アクセント付きラテン文字をアクセントなしに変換し、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/

87
joeforker

私の元の答えでは、unicodedata.normalizeも提案しました。ただし、テストすることにしましたが、Unicodeの引用符では機能しないことがわかりました。アクセント付きUnicode文字の翻訳に適しているので、unicodedata.normalizeunicode.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の句読点文字を1つずつ処理することを必ずしも心配する必要はないと思います。 doアクセントやその他の発音区別記号を処理する必要がある場合でも、unicodedata.normalizeを使用してそれらの文字を処理できます。

24
Mike Spross

興味深い質問。

Googleは このページnicodedataモジュール を使用して次のように記述します:

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

これについての追加の議論は http://code.activestate.com/recipes/251871/ にあります。NFKDソリューションがあり、±=> +/-などのような変換テーブルを実行するいくつかの方法があります。およびその他の文字以外の文字。

3
Andrew Dalke