Вам необходимо установить надлежащий объект 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
определяет исходную и конечную кодировку, затем сохраняет преобразованные байты в переменной с именем ... converted
. Затем он записывается непосредственно в выходной файл.
Как я уже сказал, первый вариант с использованием StreamReader
и StreamWriter
будет намного проще, если это все, что вы делаете, но последний пример должен дать вам больше намека на то, что происходит на самом деле.
Вы пробовали использовать StreamWriter с кодировкой UTF8, чтобы написать AsciiString из к текстовый файл? Это делает это? – Task
@ Task: Его проблема в том, что он никогда не получает строку из 8859-1, а не то, что он не может сохранить ее в UTF-8. –
О, это его проблема, не вопрос. Мне просто легче отлаживать преобразование текста с помощью пары StreamReader/StreamWriter (так что я могу видеть файлы ввода/вывода), а не с вызовом Encoding.Convert. Это может быть только я. – Task