Вам нужно получить правильный объект 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
. 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
задает кодировку источника и назначения, а затем сохраняет преобразованные байты в переменной с именем ..._ 11_. Затем это напрямую записывается в выходной файл.
Как я уже сказал, первый вариант с использованием StreamReader
и StreamWriter
будет намного проще, если это все, что вы делаете, но последний пример должен дать вам больше подсказок относительно того, что на самом деле происходит.
person
Adam Robinson
schedule
07.04.2010