左二重引用符、アポストロフィの右一重引用符など、Unicode句読点を使用するテキストがいくつかあり、ASCIIで必要です。Pythonには、明らかなASCII置換を備えたこれらの文字のデータベースがあるので、すべてを「?」に変換するよりもうまくいくことができます。?
回答:
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/
s/ö/oe/
は、残りの文字をunidecode
。でクリーンアップする前に、該当する文字を手動で変換します(など)。
ä -> a
、ö -> o
完全に間違っている、それはまだすることが好ましいae
とoe
私の最初の答えでは、私も提案しました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
、それらの文字に対処します。
興味深い質問です。
グーグルは私が次のようにunicodedataモジュールを使用して説明するこのページを見つけるのを手伝ってくれました:
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')