0

別のソフトウェア プログラムから Excel xml ファイルにインポートされた文字列のリストを読み込んでいます。Excelファイルのエンコーディングが何であるかはわかりませんが、そのエンコーディングを使用しようとすると多くのエラーが発生するため、windows-1252ではないことは確かです。

今私を悩ませている特定の単語は、「Zmysłowska、Magdalena」です(「l」は標準の「l」ではなく、スラッシュが含まれていることに注意してください)。

私はいくつかのことを試しましたが、ここではそのうちの 3 つについて言及します。

(1)

page = unicode(page, "utf-8")
page = unicodedata.normalize("NFKD", page)
page = page.encode("utf-8", "ignore")

Output: Zmys\xc5\x82owska, Magdalena
Output after print statement: Zmysłowska, Magdalena

(2)

page = unicode(page, "utf-8")
page = unicodedata.normalize("NFKD", page)

Output: Zmys\u0142owska, Magdalena
Output after print statment: Zmysłowska, Magdalena

Note: this is great, but I need to encode it back to utf-8 before putting the string into my     db.  When I do that, by running page.encode("utf-8", "ignore"), I end up with Zmysłowska, Magdalena again.

(3) 何もしない (正規化なし、デコードなし、エンコードなし)。文字列が入ってくると、すでに utf-8 になっているようです。ただし、何もしないと、文字列は次の出力で終了します。

Output: Zmys\xc5\x82owska, Magdalena
Output after print statement: Zmysłowska, Magdalena

この文字列を utf-8 に変換する方法はありますか?

4

1 に答える 1

2

あなたの問題は、エンコードとデコードではありません。コードは UTF-8 文字列を正しく受け取り、それを NFKD で正規化された UTF-8 文字列に変換します。( Python 3 に移行する場合に備えて、将来を保証するためだけでpage.decode("utf-8")なく、とがより明らかに並列でunicode(page, "utf-8")あるため、コードを読みやすくするために使用することもできますが、その必要はありません。同等です。)encodedecode

実際の問題は、UTF-8 文字列を UTF-8 ではないコンテキストに出力していることです。ほとんどの場合cmd、Windows-1252 にデフォルト設定されているウィンドウに印刷しています。そのcmdため、UTF-8 文字を Windows-1252 として解釈しようとし、ガベージを取得します。

これをテストするための非常に簡単な方法があります。Windows-1252 であるかのように Python に UTF-8 文字列をデコードさせ、結果の Unicode 文字列が表示されているように見えるかどうかを確認します。

>>> print page.decode('windows-1252')
Zmysłowska, Magdalena

>>> print repr(page.decode('windows-1252'))
u'Zmys\xc5\u201aowska, Magdalena'

これには 2 つの方法があります。

  1. Unicode 文字列を出力し、Python に任せます。
  2. 適切なエンコーディングに変換された文字列を出力します。

オプション 1 の場合:

print page.decode("utf-8") # of unicode(page, "utf-8")

オプション 2 の場合、次のいずれかになります。

print page.decode("utf-8").encode("windows-1252")
print page.decode("utf-8").encode(sys.getdefaultencoding())

もちろん、中間の Unicode 文字列を残しておけば、これらすべてのdecode呼び出しは必要ありません。

upage = page.decode("utf-8")
upage = unicodedata.normalize("NFKD", upage)
page = upage.encode("utf-8", "ignore")

print upage
于 2012-12-17T21:11:25.473 に答える