4

Unicode 文字列を iso-8859-15 に変換したい。これらの文字列には、iso-8859-15 文字セットの一部ではないu"\u2019"(RIGHT SINGLE QUOTATION MARK http://www.fileformat.info/info/unicode/char/2019/index.htmを参照) 文字が含まれます。

Python では、iso-8859-15 エンコーディングに一致するようにユニコード文字を正規化する方法は?

私は成功せずに unicodedata モジュールを見てきました。私はなんとか仕事をすることができます

s.replace(u"\u2019", "'").encode('iso-8859-15')

しかし、より一般的でクリーンな方法を見つけたいと思います。

ご協力いただきありがとうございます

4

3 に答える 3

6

変換ルールを作成する場合を除いて(作成する場合は、Boudの回答を参照してください)、デフォルトのエラーハンドラーのいずれかを選択encodeするか、独自のエラーハンドラーを登録することもできます。

In [4]: u'\u2019 Hi'.encode('iso-8859-15', 'replace')
Out[4]: '? Hi'

In [5]: u'\u2019 Hi'.encode('iso-8859-15', 'ignore')
Out[5]: ' Hi'

In [6]: u'\u2019 Hi'.encode('iso-8859-15', 'xmlcharrefreplace')
Out[6]: '’ Hi'

encodedocstringから:

S.encode([encoding [、errors]])->文字列またはUnicode

エンコード用に登録されたコーデックを使用してSをエンコードします。エンコーディングのデフォルトはデフォルトのエンコーディングです。別のエラー処理スキームを設定するためにエラーが発生する場合があります。デフォルトは「strict」です。これは、エンコードエラーによってUnicodeEncodeErrorが発生することを意味します。その他の可能な値は、「ignore」、「replace」、「xmlcharrefreplace」、およびUnicodeEncodeErrorsを処理できるcodecs.register_errorに登録されているその他の名前です。

于 2012-05-28T13:34:42.587 に答える
6

がユニコード文字列であるtranslateと仮定して、関数のユニコード バージョンを使用します。s

s.translate({ord(u"\u2019"):ord(u"'")})

の Unicode バージョンの引数は、translateUnicode 序数を Unicode 序数にマッピングする dict です。この dict に、ターゲット エンコーディングでエンコードできない他の文字を追加します。

もう少し読みやすい形式でマッピング テーブルを作成し、そこからマッピング dict を作成できます。たとえば、次のようになります。

char_mappings = [(u"\u2019", u"'"),
                 (u"`", u"'")]
translate_mapping = {ord(k):ord(v) for k,v in char_mappings}

翻訳ドキュメントから:

Unicode オブジェクトの場合、translate() メソッドはオプションの deletechars 引数を受け入れません。代わりに、指定された変換テーブルを介してすべての文字がマップされた s のコピーを返します。これは、Unicode 序数から Unicode 序数、Unicode 文字列、または None へのマッピングでなければなりません。マップされていない文字はそのまま残ります。None にマップされた文字は削除されます。より柔軟なアプローチは、コーデック モジュールを使用してカスタム文字マッピング コーデックを作成することです (例については、encodings.cp1251 を参照してください)。

于 2012-05-28T13:25:28.120 に答える
3

情報については、私の最終的な解決策:

iso885915_utf_map = {
    u"\u2019":  u"'",
    u"\u2018":  u"'",
    u"\u201c":  u'"',
    u"\u201d":  u'"',
}
utf_map = dict([(ord(k), ord(v)) for k,v in iso885915_utf_map.items()])
s.translate(utf_map).encode('iso-8859-15')

ご協力ありがとうございました

于 2012-05-28T14:30:18.277 に答える