14

こんにちは、

私が本当に試したとしても... 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. ああ、私はPython2.7.3を使用しています。サードパーティモジュールの依存関係、ご存知のとおり...

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

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

挨拶!

4

3 に答える 3

28

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

Unicodeとエンコーディング

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

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

これはPython3で変更されました(unicode現在strおよびstr現在bytes)。

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

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

  • 受け取るものはすべてエンコードされているので、input_string.decode('encoding')に変換しunicodeます。
  • 出力する必要があるものはすべてUnicodeですが、エンコードする必要があるので、そうしますoutput_string.encode('encoding')

最も一般的なエンコーディングはcp-1252、Windows(USまたはEUシステム)およびutf-8Linuxです。

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

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

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

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

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

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

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

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

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

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

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

ああ、私はPython2.7.3を使用しています。サードパーティモジュールの依存関係、ご存知のとおり...

Python 3は、Unicodeとエンコーディングの点でおそらく大きなアップデートですが、それはPython 2.xがそれを機能させることができないという意味ではありません!

それで問題は解決しますか?

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

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

于 2012-12-29T11:58:47.090 に答える
5

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

于 2016-05-11T16:34:14.903 に答える
0

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

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

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

于 2012-12-29T07:11:37.650 に答える