86

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

4

3 に答える 3

90

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

于 2009-11-09T14:37:23.273 に答える
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それらの文字を処理できます。

于 2009-05-03T04:16:58.013 に答える
21

興味深い質問です。

Google は、次のようにunicodedata モジュールを使用して記述しているこのページを見つけるのを手伝ってくれました。

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
于 2009-05-03T04:15:43.367 に答える