左二重引用符、アポストロフィの右一重引用符など、Unicode句読点を使用するテキストがあり、ASCIIで必要です。Pythonには、明らかなASCII置換を使用したこれらの文字のデータベースがあるので、すべてを「?」に変換するよりもうまくいくことができます。?
3 に答える
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/
私の最初の答えでは、私も提案し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
それらの文字を処理できます。
興味深い質問です。
Google は、次のようにunicodedata モジュールを使用して記述しているこのページを見つけるのを手伝ってくれました。
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')