2009-05-03 17 views
79

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

+21

あなたは勇敢な戦士です。 UnicodeはPythonのアーチ・ネメシスです。 –

+1

これを知っている人は、[PythonのUnicode文字列でアクセントを削除するにはどうすればよいですか?](http://stackoverflow.com/q/517923/562769) –

答えて

84

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

Hm ..ドイツ語のウムラウトは、例えば、 ö= oe、ä= aeなど。 – ThiefMaster

+4

@ThiefMasterは、すべての言語で当てはまる同等のものですか?たぶんUnidecodeは最低の共通分母に向かいます。 –

+0

言語に依存しないソリューションのためには、確かにユニコードが使用されます。ドイツ語を中心としたソリューションの場合は、適切なcharectersを手作業で( 's /ö/ oe /'など)変換してから、残りを 'unidecode 'でクリーンアップしてください。 – alexis

19

興味深い質問です。

Googleは、以下のようunicodedata moduleを使用してdescibesたthis pageを見つける私を助け:

私のオリジナルの答えで
import unicodedata 
unicodedata.normalize('NFKD', title).encode('ascii','ignore') 
+1

便利ですが、Unicodeの句読点を捨てます。 – joeforker

24

、私はまた、unicodedata.normalizeを示唆しました。しかし、私はそれをテストすることにしました。それはUnicodeの引用符では機能しません。アクセント付きのUnicode文字を変換するのはうまくいくので、unicodedata.normalizeunicode.decomposition関数を使って実装されていると推測しています。これはおそらく文字と分音記号の組み合わせであるUnicode文字しか処理できないと信じています実際にはUnicode仕様のエキスパートではないので、私は熱い空気でいっぱいになるかもしれません...

どんな場合でも、句読点文字を扱うのにunicode.translateを使うことができます。必要な場合は、より多くの句読点マッピングを追加することができます

'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!"' 

が、私ドン:translate方法は、このようにあなたは句読点と互換性をASCIIにUnicode文字のみの句読点を変換マッピングを作成することができ、Unicodeの序にUnicodeの序の辞書を取りますすべてのUnicodeの句読点文字を処理することを必ずしも心配する必要はないと思います。 でアクセントやその他の発音記号を処理する必要がある場合は、unicodedata.normalizeを使用してこれらの文字を処理できます。

+0

'unidecode'パッケージも参照してください – joeforker

関連する問題