こんにちは、
私が本当に試したとしても...Python、Windows、Ansi、文字エンコード)に関しては、行き詰まり、やや必死です。私は助けが必要です、真剣に...過去数時間ウェブを検索することは何の助けにもなりませんでした、それはただ私を夢中にさせます。
私はPythonを初めて使用するので、何が起こっているのかほとんどわかりません。私は言語を学ぼうとしているので、ほぼ完了した最初のプログラムは、mp3を含む特定のフォルダーから音楽プレイリストを自動的に生成するはずです。 1つの問題に加えて、これは問題なく機能します...
...ウムラウト(äöü)をプレイリストファイルに書き込めません。
"間違ってエンコードされた"_sys.argv
_のデータの解決策を見つけた後、私はそれを処理することができました。 MP3からメタデータを読み取るとき、私はある種の単純な文字置換を使用して、フランス語のアクセントやこのクレイジーなスカンジナビア語 "o"などの国際的な特殊文字をすべて取り除きます。スラッシュ(入力方法すらわかりません...)。大丈夫だ。
しかし、少なくとも言及されたウムラウトをプレイリストファイルに書きたいのですが、これらの文字はここドイツでは本当に一般的です。また、文字の欠落やスペルミスを気にしないメタデータとは異なり、これは関連性があります。これは、ファイルへのパスを書き込んでいるためです。
さまざまなエンコードとデコードの方法を試しましたが、ここにすべてをリストすることはできません。30分前に試した設定がわかりません。私はオンライン、ここ、および他の場所で、いくつかの目的のために機能しているように見えるコードを見つけました。私のためではありません。
トリッキーな部分はこれだと思います。問題はAnsi呼び出されたファイルのフォーマットであるようです。正解-私は実際にこのAnsiのものが必要です。約2時間前、私は実際にUFT-8ファイルに好きなものを書き込むことができました。チャームのように機能します...私のプレーヤー(Winamp、古いバージョン)がどういうわけかそれらのUTF-8プレイリストファイルで動作しないことに気付くまで。私のエディターで正しく表示されていても、パスを解決できませんでした。
ファイル形式をAnsiに戻すと、特別な文字を含むパスが破損します。推測しているだけですが、WinampがこのUTF-8ファイルをAnsiとして読み取ると、現在発生している問題が発生します。
そう...
line.write(str.decode('utf-8'))
のようなものはファイルの機能を壊します# -*- coding: iso-8859-1 -*-
_のようなスクリプトの冒頭にある魔法のコメントはここでは何もしません(ただし、前述のメタデータとその中で許可されている文字に関しては役立ちます...)このエンコーディングの地獄から抜け出す方法を教えてくれる人はいますか?どんな助けでも大歓迎です。別の関数またはクラスに500行のコードが必要な場合は、それらを入力します。そのようなものを処理するためのモジュールがあれば、私に知らせてください!買おう!役立つものはすべてテストされます。
読んでくれてありがとう、コメントをありがとう、
挨拶!
コメントで述べたように、あなたの質問はあまり具体的ではないので、文字エンコードについていくつかのヒントを提供しようとします。それらを特定のケースに適用できるかどうかを確認してください。
これは、エンコーディングに関する簡単な入門書です。基本的に、Pythonでテキストを表現する方法は2つあります。
unicode
。 unicode
は究極のエンコーディングであると考えることができるので、どこでも使用できるように努力する必要があります。 Python 2.xソースファイルでは、unicode
文字列は_u'some unicode'
_のようになります。str
。これはエンコードされたテキストです-それを読むことができるようにするには、エンコードを知っている(または推測する)必要があります。 Python 2.xでは、これらの文字列は_'some str'
_のようになります。これはPython 3(unicode
はstr
になり、str
はbytes
になりました)で変更されました。
通常、コードの実行にunicode
を使用し、I/Oにstr
を使用することを確認するのは非常に簡単です。
input_string.decode('encoding')
それをunicode
に変換します。output_string.encode('encoding')
を実行します。最も一般的なエンコーディングは、Windows(米国またはEUシステム)では_cp-1252
_、Linuxでは_utf-8
_です。
Windowsはファイルパスと名前にネイティブにunicode
を使用するため、実際には常にunicode
を使用する必要があります。
ファイルに書き込むときは、必ずoutput.encode('cp1252')
を介して出力を実行してください(または ANSIをエンコードするものは何でも システム上にあります)。
今までにあなたはおそらくそれを理解しました:
str
が実際にstr
インスタンスである場合、Pythonは_utf-8
_エンコーディングを使用してunicode
に変換しようとしますが、次に、それをファイルに書き込むために(おそらくascii
で)再度エンコードしてみますstr
が実際にunicode
インスタンスである場合、Pythonは最初にそれをエンコードします(おそらくascii
で、それはおそらくクラッシュします)。それをデコードすることができます。要するに、str
がunicode
であるかどうかを知る必要があり、encode
である必要があります。すでにエンコードされている場合は、触れないでください(または、エンコードが目的のコードでない場合は、decode
、次にencode
)。
当然のことながら、これはPython非ASCII文字が正しく認識されるように、ソースファイルを読み取るために使用するエンコードを指示するだけです。
Python 3は、Unicodeとエンコーディングの点でおそらく大きな更新ですが、それはPython 2.xが機能しないという意味ではありません!
確信が持てません。問題は、コードではなく、使用しているプレーヤーにある可能性があります。
出力したら、参照ツール(Windowsエクスプローラーなど)を使用してスクリプトの出力が読み取り可能であることを確認する必要があります。開いているのにプレーヤーがそれを開くことができない場合は、新しいバージョンへの更新を検討する必要があります。
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
# -*- coding
コメントは、ソースコードの文字エンコード(したがって、'abc'
のようなバイト文字列リテラル)を宣言します。
「プレイリスト」がm3u
ファイルを意味すると仮定すると、 この仕様 に基づいて、使用しているmp3プレーヤーソフトウェアに翻弄される可能性があります。この仕様では、ファイルにテキストが含まれていることのみが記載されており、文字エンコードについては言及されていません。
私は個人的に、さまざまなmp3エンコーディングソフトウェアがmp3メタデータに異なるエンコーディングを使用することを観察しました。 UTF-8を使用するものもあれば、ISO-8859-1を使用するものもあります。そのため、構成でエンコードを指定できるようにし、そのままにしておく必要がある場合があります。