8

繰り返しますが、ユニコードの質問で非常に混乱しています。unicodedata.normalizeを正常に使用して非 ASCII 文字を期待どおりに変換する方法がわかりません。たとえば、文字列を変換したい

u"Cœur"

u"Coeur"

unicodedata.normalize がこれを行う方法であると確信していますが、動作させることはできません。文字列を変更しないだけです。

>>> s = u"Cœur"
>>> unicodedata.normalize('NFKD', s) == s
True

私は何を間違っていますか?

4

3 に答える 3

21

あなたは試すことができますUnidecode

# -*- coding: utf-8 -*-
from unidecode import unidecode # $ pip install unidecode

print(unidecode(u"Cœur"))
# -> Coeur
于 2012-10-18T04:28:15.953 に答える
6

あなたの問題は Python とは関係がないようですが、分解しようとしている文字 (u'\u0153' - 'œ') は構成自体ではありません。

コードが「ç」や「ã」などの通常の複合文字を含む文字列で機能することを確認します。

>>> a1 = a
>>> a = u"maçã"
>>> for norm in ('NFC', 'NFKC', 'NFD','NFKD'):
...    b = unicodedata.normalize(norm, a)
...    print b, len(b)
... 
maçã 4
maçã 4
maçã 6
maçã 6

そして、両方の文字 (あなたの文字と c + cedila) の Unicode 参照を確認すると、後者には前者にはない「分解」仕様があることがわかります。

http://www.fileformat.info/info/unicode/char/153/index.htm
http://www.fileformat.info/info/unicode/char/00e7/index.htm

「œ」は正式には「oe」と同等ではないようです-(少なくともこのユニコード部分を定義した人々にとっては)-したがって、これを含むテキストを正規化する方法は、文字を手動で置き換えることですunicode.replace を使用したシーケンス - ハッキーに聞こえるかもしれません。

于 2012-10-17T23:32:57.637 に答える
3

jsbueno が言うように、一部の文字には互換性分解がありません。

Unicode CLDR Latin-ASCII 変換を使用して、手動置換のマッピングを生成できます。

于 2012-10-18T04:10:36.417 に答える