24

ISO 88591-1形式で保存された、Latin-1 範囲のアクセント付き文字 (および通常の ASCII az など) を含むテキスト ファイルが送信されます。ISO 8859-1 のシングルバイトのアクセント付き文字が有効な UTF-8 文字になるように、C# を使用してこれらのファイルをUTF-8に変換するにはどうすればよいですか?

私は ASCIIEncoding で StreamReader を使用しようとしました。次に、エンコードとエンコードをインスタンス化してから使用することにより、ASCII 文字列を UTF-8 に変換しようとしましたがascii、アクセント付きの文字が疑問符としてレンダリングされています。utf8Encoding.Convert(ascii, utf8, ascii.GetBytes( asciiString) )

どのステップが欠けていますか?

4

2 に答える 2

43

Encoding適切なオブジェクトを取得する必要があります。ASCII はその名の通り ASCII で、7 ビットの ASCII 文字のみをサポートすることを意味します。ファイルを変換する場合は、バイト配列を直接処理するよりも簡単です。

using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName,
                                       Encoding.GetEncoding("iso-8859-1")))
{
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(
                                           outFileName, Encoding.UTF8))
    {
        writer.Write(reader.ReadToEnd());
    }
}

ただし、自分でバイト配列を持ちたい場合は、Encoding.Convert.

byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
    Encoding.UTF8, data);

ただし、この道を進みたい場合は、ファイル IO のようなエンコーディング ベースの文字列リーダーを使用しないでください。ファイルの実際のバイトを読み取るため、より適しています。StreamReaderFileStream

問題を完全に調査するには、次のようにします。

using (System.IO.FileStream input = new System.IO.FileStream(fileName,
                                    System.IO.FileMode.Open, 
                                    System.IO.FileAccess.Read))
{
    byte[] buffer = new byte[input.Length];

    int readLength = 0;

    while (readLength < buffer.Length) 
        readLength += input.Read(buffer, readLength, buffer.Length - readLength);

    byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
                       Encoding.UTF8, buffer);

    using (System.IO.FileStream output = new System.IO.FileStream(outFileName,
                                         System.IO.FileMode.Create, 
                                         System.IO.FileAccess.Write))
    {
        output.Write(converted, 0, converted.Length);
    }
}

この例では、buffer変数にはファイル内の実際のデータが として入力されるbyte[]ため、変換は行われません。Encoding.Convertソースと宛先のエンコーディングを指定し、変換されたバイトを ... という名前の変数に格納しますconverted。これは、出力ファイルに直接書き込まれます。

私が言ったように、StreamReaderandStreamWriterを使用する最初のオプションは、これだけを行っている場合ははるかに簡単ですが、後者の例では、実際に何が起こっているかについてのヒントが得られるはずです。

于 2010-04-07T19:59:04.553 に答える
15

ファイルが比較的小さい場合 (たとえば、10 メガバイト程度)、必要なコードは 2 行だけです。

  string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
  System.IO.File.WriteAllText(outPath, txt);
于 2010-04-07T20:31:01.817 に答える