Страницы

Поиск по вопросам

четверг, 19 марта 2020 г.

Кодировка: UTF8 -> ANSI

#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, тогда русские символы будут отображаться корректно.

Комментариев нет:

Отправить комментарий