3

私の Python スクリプトは、Windows XP で xml ファイルを作成しますが、そのファイルは、'ñ' や一部のアクセント付き文字などのスペイン語文字で正しいエンコーディングを取得しません。

まず、ファイル名は次のコードを使用して Excel シェルから読み取られます。私は Excel ファイル xlrd ライブラリを読み取るために使用します。

filename = excelsheet.cell_value(rowx=first_row, colx=5)

次に、正しいエンコードでファイルを生成するために、いくつかのエンコードを試しましたが成功しませんでした。

filename = filename[:-1].encode("utf-8")
filename = filename[:-1].encode("latin1")
filename = filename[:-1].encode("windows-1252")

"windows-1252" を使用すると、文字 'ñ'、'í'、'é' のエンコードが正しくありません。たとえば、BAJO ARAGÓN_Alcañiz.xmlではなく、BAJO ARAGÓN_Alcañiz.xmlを取得しました。

よろしくお願いいたします。

4

4 に答える 4

1

ファイル名には Unicode 文字列を使用する必要があります。一般に、オペレーティング システムは、任意の Unicode 文字を含むファイル名をサポートしています。したがって、次のようにします。

fn = u'ma\u00d1o'  # maÑo
f = open(fn, "w")
f.close()
f = open(fn, "r")
f.close()

それはうまくいくはずです。別のことは、そのファイルが存在するディレクトリの内容をリストするときに端末に表示されるものです。端末のエンコーディングが UTF-8 の場合、ファイル名 maño が表示されますが、エンコーディングがたとえば iso-8859-1 の場合、maño が表示されます。しかし、これらの奇妙な文字が表示された場合でも、上記のように python からファイルを開くことができるはずです。

要約すると、出力をエンコードしないでください

filename = excelsheet.cell_value(rowx=first_row, colx=5)

代わりに、Unicode 文字列であることを確認してください。

Python Unicode HOWTOのUnicode ファイル名のセクションを読むと役に立ちます。

于 2012-10-23T16:39:58.163 に答える
1

あなたの答えを試してみると、Python 2.7 から Python 3.3 にスクリプトを移植するという迅速な解決策が見つかりました。私のコードを移植する理由は、Python 3 がデフォルトで Unicode で動作するためです。

コードに少し変更を加えて、xlrd ライブラリをインポートする必要がありました (以前は xlrd3 をインストールする必要がありました)。

import xlrd3 as xlrd

また、encode() の代わりに str を使用して、コンテンツを「バイト」から「文字列」に変換する必要がありました

filename = str(filename[:-1])

これで、私のスクリプトは完璧に機能し、奇妙な文字を使わずに Windows XP でファイルを生成できるようになりました。

于 2012-10-24T08:37:13.630 に答える
0

Windowsでは、ファイルシステムはUTF-16を使用するため、明示的なエンコードは必要ありません。ファイル名にはUnicode文字列を使用し、ソースファイルのエンコーディングを必ず宣言してください。

# coding: utf8
with open(u'BAJO ARAGÓN_Alcañiz.xml','w') as f:
    f.write('test')

また、たとえば、米国のWindowsシステムÓのエンコーディングではサポートされていませんが、コンソールフォントは文字をサポートしており、コンソールに正しく表示されます。コンソールはUnicodeをサポートしていますが、非Unicodeプログラムはコードページ文字の読み取り/書き込みのみが可能です。cp437

于 2012-10-23T17:41:03.930 に答える
0

まず、読んでいない場合は、http://www.joelonsoftware.com/articles/Unicode.html を読んでください-

現在、「latin-1」は Windows でのスペイン語エンコーディングで機能するはずです - 2 つの仮説があります: いずれかのエンコーディングに「エンコード」しようとしている文字列は、Unicdoe 文字列ではありませんが、既に何らかのエンコーディングに含まれています。ただし、奇妙な文字よりも UnicodeDecodeError が発生する可能性が高くなりますが、まれなケースでは機能する可能性があります。

より可能性の高いケースは、Windows Prompt AKA 'CMD" を使用してファイルをチェックしている場合です。何らかの理由で、Microsoft Windows はシステムに2 つの異なるエンコーディングを使用します。 latin1 と、コマンド プロンプトを配置する従来の DOS プログラム用の別のもの. ポルトガル語の場合、この 2 番目のエンコーディングは "cp852" です (調べてみると、cp852 では "ñ" が定義されていませんが、cp850 では定義されています)。

したがって、これが起こります:

>>> print u"Aña".encode("latin1").decode("cp850")
A±a
>>> 

したがって、ファイル名を DOS プロンプトから正しく表示するには、「CP850」を使用してエンコードする必要があります。Windows プログラムから正しく表示するには、「cp1252」(または「latin1」または「iso」を使用してエンコードしてください) -8859-15" - それらはほとんど同じで、「€」記号を付けたり取ったりします)

もちろん、誰かがあなたのプログラムをノルウェー、ロシア、または Posix システムで実行すると失敗するような、見栄えの良いものを推測して選択するのではなく、次のようにする必要があります。

import sys
encoding = sys.getfilesystemencoding()

(これにより、上記のいずれかが返されるはずです。繰り返しますが、ファイル名は、DOS シェルからではなく、Windows プログラムからの場合は正しく表示されます)

于 2012-10-23T16:39:35.230 に答える