私はファイルにこのテキストを持っています - Recuérdame (フランス語の単語であることに注意してください)。このファイルを Python スクリプトで読み取ると、このテキストはRecuérdame
.
ユニコード文字列として読みました。テキストのエンコーディングを見つけてデコードする必要がありますか? または、私の端末が私にいたずらをしているのですか?
私はファイルにこのテキストを持っています - Recuérdame (フランス語の単語であることに注意してください)。このファイルを Python スクリプトで読み取ると、このテキストはRecuérdame
.
ユニコード文字列として読みました。テキストのエンコーディングを見つけてデコードする必要がありますか? または、私の端末が私にいたずらをしているのですか?
はい、(ファイルを構成するバイトから)Unicode文字列に変換するには、テキストファイルのエンコーディングを知っている必要があります。
たとえば、エンコーディングがUTF-8であることがわかっている場合:
with open('foo.txt', 'rb') as f:
contents = f.read().decode('utf-8-sig') # -sig takes care of BOM if present
ただし、ファイル内のテキストはUnicodeでエンコードされていないようです。アクセント付きの文字は明らかにXMLエンティティとして保存されており、手動で変換する必要があります(リンクのjleedevへの帽子の先端)。
Unicode文字列ではありません。これは、エンコードされているエンコードの文字列です。したがって、UTF-8またはLatin-1またはその他の文字列です。この場合、é
は、具体的にはéを表すHTML/XMLエンティティです。これは、非ASCIIデータをエンコードするためにHTMLおよびXMLで使用されるエンコードです。
これをUnicodeにデコードするには、Fredrik Lundhsメソッドを見てください:http://effbot.org/zone/re-sub.htm#unescape-html
これはHTMLであり、この構成は「エンティティ」と呼ばれます。使用できます
def entity_decode(match):
_, is_hex, entity = match.groups()
base = 16 if is_hex else 10
return unichr(int(entity, base))
print re.sub("(?i)(&#(x?)([^;]+);)",
entity_decode,
"Recurdame")
すべてのエティティをデコードします。
編集:はい、もちろんlatin1ではありません。すべてのエンティティで機能するはずです。
xlrdを使用して、行に... xl_data.find(str(cell_value))...エラーが発生します:"'ascii'コーデックは位置3の文字u'\ xdf'をエンコードできません:序数ではありません範囲内(128)」。フォーラムでのすべての提案は、私のドイツ語では役に立たなかった。ただし、次のように変更すると、... xl_data.find(cell.value)...エラーは発生しません。したがって、xldrを使用する特定のコマンドで引数として文字列を使用すると、特定のエンコードの問題が発生すると思います。