#c_sharp #перекодировка
Столкнулся со следующей проблемой: есть файл в ANSI кодировке и я его считываю построчно, но насколько я правильно понял, в C# эта считанная строка хранится в юникоде и в ней я наблюдаю какие-то иероглифы. Что делаю я (на примере 1-ой строчки файла): StreamReader read = new StreamReader(@"D:\(path)"); StreamWriter write = new StreamWriter(@"D:\(path)"); Encoding ANSI = Encoding.GetEncoding(1252); Encoding UTF8 = Encoding.UTF8; byte[] utf8_bytes,ansi_bytes; utf8_bytes = UTF8.GetBytes(read.ReadLine()); ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes); string ansi_str = ANSI.GetString(ansi_bytes); write.WriteLine(ansi_str); read.Close(); write.Close(); Но это почему-то не работает: в новом файле все также отображается много непонятных вопросительных знаков. Заранее спасибо.
Ответы
Ответ 1
Посмотрите внимательнее на код: прочитать текст, записанный в файле в UTF-8 (по умолчанию для StreamReader) записать текст в UTF-16LE строке (класс System.String в .NET) получить представление текста в кодировке UTF-8 в виде массива байтов преобразовать текст из UTF-8 в ANSI, получая массив байтов преобразовать текст из кодировки ANSI в UTF-16LE для записи в System.String записать текст (который сейчас в System.String), используя StreamWriter (который по умолчанию пишет в кодировке UTF-8) Итого получается, что текст проходит следующие преобразования: UTF-8 (StreamReader) -> UTF-16LE (System.String) -> UTF-8 (byte[]) -> ANSI (byte[]) -> UTF-16LE (System.String) -> UTF-8 (StreamWriter) Думаю, что теперь стало очевидно, в чём проблема.Ответ 2
StreamReader read = new StreamReader(@"D:\(path)"); StreamWriter write = new StreamWriter(@"D:\(path)"); Encoding ANSI = Encoding.GetEncoding(1251); Encoding UTF8 = Encoding.UTF8; byte[] utf8_bytes,ansi_bytes; utf8_bytes = UTF8.GetBytes(read.ReadLine()); ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes); string ansi_str = ANSI.GetString(ansi_bytes); write.WriteLine(ansi_str); read.Close(); write.Close(); Попробуйте 1251 вместо 1252, тогда русские символы будут отображаться корректно.
Комментариев нет:
Отправить комментарий