保存されたテキストファイルが送信されます88591-1 規格Latin-1範囲のアクセント付き文字(および通常のASCIIのazなど)を含む形式。これらのファイルをUTF-8C# を使用して、ISO 8859-1 の 1 バイトのアクセント付き文字を有効な UTF-8 文字にすることはできますか?
ASCIIEncoding で StreamReader を使用し、encodingascii
と encoding をインスタンス化して ASCII 文字列を UTF-8 に変換してから使用しようとしutf8
ましたEncoding.Convert(ascii, utf8, ascii.GetBytes( asciiString) )
が、アクセント付き文字が疑問符としてレンダリングされます。
どのステップが欠けているのでしょうか?
ベストアンサー1
適切なオブジェクトを取得する必要があります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
の方がはるかに簡単ですが、後者の例を見ると、実際に何が起こっているのかについてより多くのヒントが得られるはずです。