web-dev-qa-db-ja.com

.NETを使用して、Latin-1アクセント付き文字を含むISO 8859-1エンコードテキストファイルをUTF-8に変換する方法

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

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

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

17
Tim

適切な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);

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

問題を完全に調査するために、次のようなものが機能します:

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という名前の変数に格納します。次に、これは出力ファイルに直接書き込まれます。

私が言ったように、StreamReaderStreamWriterを使用する最初のオプションは、これで十分であればもっと簡単になりますが、後者の例では、実際に何が起こっているかについてのヒントが得られます。オン。

35
Adam Robinson

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

  string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
  System.IO.File.WriteAllText(outPath, txt);
14
Hans Passant