web-dev-qa-db-ja.com

Python、Windows、Ansi-エンコーディング、再び

こんにちは、

私が本当に試したとしても...PythonWindowsAnsi文字エンコード)に関しては、行き詰まり、やや必死です。私は助けが必要です、真剣に...過去数時間ウェブを検索することは何の助けにもなりませんでした、それはただ私を夢中にさせます。

私はPythonを初めて使用するので、何が起こっているのかほとんどわかりません。私は言語を学ぼうとしているので、ほぼ完了した最初のプログラムは、mp3を含む特定のフォルダーから音楽プレイリストを自動的に生成するはずです。 1つの問題に加えて、これは問題なく機能します...

...ウムラウト(äöü)をプレイリストファイルに書き込めません。

"間違ってエンコードされた"_sys.argv_のデータの解決策を見つけた後、私はそれを処理することができました。 MP3からメタデータを読み取るとき、私はある種の単純な文字置換を使用して、フランス語のアクセントやこのクレイジーなスカンジナビア語 "o"などの国際的な特殊文字をすべて取り除きます。スラッシュ(入力方法すらわかりません...)。大丈夫だ。

しかし、少なくとも言及されたウムラウトをプレイリストファイルに書きたいのですが、これらの文字はここドイツでは本当に一般的です。また、文字の欠落やスペルミスを気にしないメタデータとは異なり、これは関連性があります。これは、ファイルへのパスを書き込んでいるためです。

さまざまなエンコードとデコードの方法を試しましたが、ここにすべてをリストすることはできません。30分前に試した設定がわかりません。私はオンライン、ここ、および他の場所で、いくつかの目的のために機能しているように見えるコードを見つけました。私のためではありません。

トリッキーな部分はこれだと思います。問題はAnsi呼び出されたファイルのフォーマットであるようです。正解-私は実際にこのAnsiのものが必要です。約2時間前、私は実際にUFT-8ファイルに好きなものを書き込むことができました。チャームのように機能します...私のプレーヤー(Winamp、古いバージョン)がどういうわけかそれらのUTF-8プレイリストファイルで動作しないことに気付くまで。私のエディターで正しく表示されていても、パスを解決できませんでした。

ファイル形式をAnsiに戻すと、特別な文字を含むパスが破損します。推測しているだけですが、WinampがこのUTF-8ファイルをAnsiとして読み取ると、現在発生している問題が発生します。

そう...

  1. パスにäöüを書く必要があります。そうしないと機能しません。
  2. ANSIで「エンコードされた」ファイルである必要があります。そうでない場合は機能しません。
  3. line.write(str.decode('utf-8'))のようなものはファイルの機能を壊します
  4. _# -*- coding: iso-8859-1 -*-_のようなスクリプトの冒頭にある魔法のコメントはここでは何もしません(ただし、前述のメタデータとその中で許可されている文字に関しては役立ちます...)
  5. ああ、私はPython 2.7.3。サードパーティモジュールの依存関係を使用しています。

このエンコーディングの地獄から抜け出す方法を教えてくれる人はいますか?どんな助けでも大歓迎です。別の関数またはクラスに500行のコードが必要な場合は、それらを入力します。そのようなものを処理するためのモジュールがあれば、私に知らせてください!買おう!役立つものはすべてテストされます。

読んでくれてありがとう、コメントをありがとう、

挨拶!

7
xph

コメントで述べたように、あなたの質問はあまり具体的ではないので、文字エンコードについていくつかのヒントを提供しようとします。それらを特定のケースに適用できるかどうかを確認してください。

Unicodeとエンコーディング

これは、エンコーディングに関する簡単な入門書です。基本的に、Pythonでテキストを表現する方法は2つあります。

  • unicodeunicodeは究極のエンコーディングであると考えることができるので、どこでも使用できるように努力する必要があります。 Python 2.xソースファイルでは、unicode文字列は_u'some unicode'_のようになります。
  • str。これはエンコードされたテキストです-それを読むことができるようにするには、エンコードを知っている(または推測する)必要があります。 Python 2.xでは、これらの文字列は_'some str'_のようになります。

これはPython 3(unicodestrになり、strbytesになりました)で変更されました。

それはどのように機能しますか?

通常、コードの実行にunicodeを使用し、I/Oにstrを使用することを確認するのは非常に簡単です。

  • 受信はすべてエンコードなので、input_string.decode('encoding')それをunicodeに変換します。
  • outputに必要なものはすべてユニコードですが、エンコードする必要があるため、output_string.encode('encoding')を実行します。

最も一般的なエンコーディングは、Windows(米国またはEUシステム)では_cp-1252_、Linuxでは_utf-8_です。

これをあなたのケースに適用する

パスにäöüを書く必要があります。そうしないと機能しません。

Windowsはファイルパスと名前にネイティブにunicodeを使用するため、実際には常にunicodeを使用する必要があります。

ANSIで「エンコードされた」ファイルである必要があります。そうでない場合は機能しません。

ファイルに書き込むときは、必ずoutput.encode('cp1252')を介して出力を実行してください(または ANSIをエンコードするものは何でも システム上にあります)。

Line.write(str.decode( 'utf-8'))のようなものは、ファイルの機能を壊します

今までにあなたはおそらくそれを理解しました:

  • strが実際にstrインスタンスである場合、Pythonは_utf-8_エンコーディングを使用してunicodeに変換しようとしますが、次に、それをファイルに書き込むために(おそらくasciiで)再度エンコードしてみます
  • strが実際にunicodeインスタンスである場合、Pythonは最初にそれをエンコードします(おそらくasciiで、それはおそらくクラッシュします)。それをデコードすることができます。

要するに、strunicodeであるかどうかを知る必要があり、encodeである必要があります。すでにエンコードされている場合は、触れないでください(または、エンコードが目的のコードでない場合は、decode、次にencode)。

#--コーディング:iso-8859-1--のようなスクリプトの冒頭にある魔法のコメントは、ここでは何もしません(ただし、言及されたメタデータとその中で許可されている文字になります...)

当然のことながら、これはPython非ASCII文字が正しく認識されるように、ソースファイルを読み取るために使用するエンコードを指示するだけです。

ああ、私はPython 2.7.3。サードパーティモジュールの依存関係を使用しています。

Python 3は、Unicodeとエンコーディングの点でおそらく大きな更新ですが、それはPython 2.xが機能しないという意味ではありません!

それはあなたの問題を解決しますか?

確信が持てません。問題は、コードではなく、使用しているプレーヤーにある可能性があります。

出力したら、参照ツール(Windowsエクスプローラーなど)を使用してスクリプトの出力が読み取り可能であることを確認する必要があります。開いているのにプレーヤーがそれを開くことができない場合は、新しいバージョンへの更新を検討する必要があります。

20
Thomas Orozco

Windowsには、mbcsと呼ばれる特別なエンコーディングがあり、現在のデフォルトのANSIコードページとUNICODEの間で変換されます。たとえば、スペイン語のPCの場合:

u'ñ'.encode('mbcs') -> '\xf1'
'\xf1'.decode('mbcs') -> u'ñ'

Windowsでは、ANSIは現在のデフォルトのマルチバイトコードページを意味します。西ヨーロッパ言語の場合はWindowsISO-8859-1、東ヨーロッパ言語の場合はWindows ISO-8859-2)エンコードされたバイト文字列、および必要に応じて他の言語用の他のエンコード。

詳細については、以下をご覧ください。

https://docs.python.org/2.4/lib/standard-encodings.html

参照:

https://docs.python.org/2/library/sys.html#sys.getfilesystemencoding

2
Glushiator

# -*- codingコメントは、ソースコードの文字エンコード(したがって、'abc'のようなバイト文字列リテラル)を宣言します。

「プレイリスト」がm3uファイルを意味すると仮定すると、 この仕様 に基づいて、使用しているmp3プレーヤーソフトウェアに翻弄される可能性があります。この仕様では、ファイルにテキストが含まれていることのみが記載されており、文字エンコードについては言及されていません。

私は個人的に、さまざまなmp3エンコーディングソフトウェアがmp3メタデータに異なるエンコーディングを使用することを観察しました。 UTF-8を使用するものもあれば、ISO-8859-1を使用するものもあります。そのため、構成でエンコードを指定できるようにし、そのままにしておく必要がある場合があります。

0
wberry