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) )
—アクセント付き文字は疑問符としてレンダリングされています。
どのステップが欠けていますか?
適切な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
という名前の変数に格納します。次に、これは出力ファイルに直接書き込まれます。
私が言ったように、StreamReader
とStreamWriter
を使用する最初のオプションは、これで十分であればもっと簡単になりますが、後者の例では、実際に何が起こっているかについてのヒントが得られます。オン。
ファイルが比較的小さい場合(たとえば、10メガバイトまで)、必要なコードは2行だけです。
string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
System.IO.File.WriteAllText(outPath, txt);