2011-06-17 10 views
0

音楽(m4a)ファイルからメタデータを読み込もうとしています。私は、メタデータに到達するためにファイルをナビゲートする方法をうまく理解しました。ファイル形式に関するドキュメントは出にくいですが、私が見つけたところでは、メタデータのエンコーディングはUTF-8であると主張しています。Windowsテキストエンコーディング質問

ここに私の髪を引っ張っている私の問題です。 Visual Basic 2008を使用してファイルにアクセスし、データを読み込みます。 BinaryStreamReaderメソッドを使用してファイルにアクセスします。しかし、メタデータタグとメタデータ自体を扱うエンコーディング設定を見つけることはできません。以下は、私が扱っているデータのサンプルの16進文字列です。

00 00 00 21 A9 6E 61 6D 00 00 00 19 64 61 74 61 00 00 00 01 00 00 00 47(c)C3 B3 73 C3 B3 6C 69

最後の9つのバイトは、トラックの名前でありますGlósóliと呼ばれています。間違いなくUTF-8です。エンコードをUTF-8に設定すると、この値を正しく取得して表示できます。しかし、4文字のメタタグ名A9 6E 61 6Dは、©namの代わりに「正方形のボックス」の名前として取得されます。エンコードをWindows-1252に変更すると、正しく正確に取得されますが、トラック名は不器用です! UTF-8エンコーディングが0xA9バイトを正しく認識しない理由を教えてください。 私はメモ帳++の©namとGlósóliに同じ2文字列を見ても同様の結果が得られることに気付きました。 FormatがUTF-8でEncodeに設定されている場合、©文字は表示されません。 FormatがANSIIに設定されている場合、トラック名は正しくありません。私は希望の結果を表示する設定を見つけることができません。私は答えが明らかだと確信しているが、私はそれを見ていない。 すべてのヘルプや説明が大幅に私はすべての最新のパッチ

でWindows XPを実行している

をいただければ幸いです

マイク

答えて

2

問題はA9がUTF-8文字をコードしないということです。 Unicode コードポイントは、エンコードされた値と同じではありません。 U+00A9は、UTF-8でC2 A9とコード化されています。 (UTF-8は、マルチバイト文字を示すために上位バイトを使用し、文字内の後続バイト数を示す追加のビットを使用します;これにより、プログラムは、ポインタが与えられても常に有効な文字の開始を見つけることができますUTF-8がUnicodeを理解できない古いプログラムとの互換性を保持する方法の一部であるマルチバイト文字の途中に挿入する必要があります。.m4aファイルをデコードするには、各フィールドを個別にデコードする必要があります。タグ名にはISO 8859/1コーデックを、タグ値には適切なコーデック(文字列の場合は常にUTF-8である必要はありません)を使用する必要があります。

(ちなみに、U+00A9A9としての第二のバイトでUTF-8にエンコードするという事実は、多かれ少なかれ偶発的であり、後者の最初の2ビットは、UTF-8エンコーディングの一部である:の部分を意味10ない次の文字とマルチバイトシーケンス;詳細linked hereC22は、実際には、元のA0の上部を表す)

ところで、hereSystem.Text.UTF8Encodingの.NETドキュメントです。クラス階層図に従って、他の.NETコーデックにアクセスできます。

0

A9単独の場合、またはこの場合のように、下位バイト(つまり、00-7Fの範囲)で囲まれたUTF-8シーケンスの一部にすることはできません。たとえば、the wikipedia entryを見てみると、すべてのハイバイト(80-FF)がマルチバイトUTF-8シーケンスの一部として発生することがわかります。

ファイル内のデータの中には、他のUTF-8以外のもの(おそらくメタデータ)があります。