4

質問が理にかなっているのかどうかは完全にはわかりません。ID3タグから取得したバイト配列を文字列に変換しています。ID3タグのほとんどのテキストフレームはISO8859-1エンコーディングを使用しますが、フレームによって異なります。いずれにせよ、ISO 8859-1コードで0x00が何であるかを調べると、それは無効です。

さらに複雑なことに、プログラマーのエラーまたはフォーマットの不備により、一部の文字列は0x00で終了し、一部は終了しません。

ISO 8859-1エンコーディングを使用して一連のバイトを文字列に変換する場合、文字列の末尾を手動でチェックして、それがnullかどうかを確認しましたか?または、そもそも変換に使用するメソッドを介したエンコーディングオブジェクトは、nullを適切に処理しますか?さらに、nullで終了する文字列を正規化または「修正」できる関数はありますか?

これらの文字列を表示しようとすると、正しく表示されません。

この特定のプロジェクトにはC#を使用しています。ID3タグに関するいくつかの追加情報:ID3仕様

それとも私は全体を完全に誤解していますか?ヌルターミネータは、特定の言語が文字列を処理する方法であり、エンコーディングとは関係ありませんか?

  • 編集:System.Text.Encoding.GetEncoding( "iso-8859-1")に続いてGetString呼び出しを使用しました
4

2 に答える 2

5

を使用するEncoding.GetEncoding(28591)と、バイト 0 が Unicode U+0000 に変換されるだけです。エンコーディングは通常、すべてのバイトを変換する必要があると想定しています - ターミネータを探しません。

この 0 の Unicode 0 としての扱いは、ウィキペディアの説明と一致しています。

1992 年に、IANA は文字マップ ISO_8859-1:1987 を登録しました。これは、より一般的には ISO-8859-1 の優先 MIME 名で知られています (ISO 8859-1 の上に余分なハイフンがあることに注意してください)。ISO 8859-1 のスーパーセットです。インターネットで使用します。このマップは、C0 および C1 制御文字を割り当てられていないコード値に割り当て、可能なすべての 8 ビット値を介して 256 文字を提供します。

C0 および C1 制御文字ページには以下が含まれます。

0: もともとは、編集のために紙テープにギャップを残すために使用されていました。後で、端末の処理に時間がかかる可能性のあるコードの後のパディングに使用されます (たとえば、印刷端末でのキャリッジ リターンまたはライン フィード)。特に C プログラミング言語では、文字列ターミネータとしてよく使用されます。

サンプルコード:

using System;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        byte[] data = { 0, 0 };
        Encoding latin1 = Encoding.GetEncoding(28591);

        string text = latin1.GetString(data);
        Console.WriteLine(text.Length); // 2
        Console.WriteLine((int) text[0]); // 0
        Console.WriteLine((int) text[1]); // 0
    }
}
于 2011-07-11T18:14:40.487 に答える
0

幸いなことに、ASCII、ISO-8859-1、および Unicode はすべて、範囲 0..127 のコードポイントで一致しています。したがって、文字'\0'は ASCII、ISO-8859-1、および UTF-8 で同じようにエンコードされます。

プログラムがゼロ バイトに特別なセマンティクスを割り当てる場合は、適切に処理する必要があります。

于 2011-07-11T18:14:31.667 に答える