Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно считать/записать файл в ANSI кодировке?  (Прочитано 8764 раз)
0 Пользователей и 1 Гость смотрят эту тему.
tumanovalex
Помогающий

ru
Offline Offline

« : 01-12-2006 21:12 » 

Есть текстовой файл с ANSI кодировкой, английскими и русскими словами.
Хочу в консольном приложении считать каждую 5-ю строку из этого файла, выввести эту строку на экран и в файл:
StreamWriter outFile = File.CreateText(FileNameOut);
StreamReader inFile  = File.OpenText(FileName);
while((input = inFile.ReadLine())!= null) {
    Math.DivRem(i, 5, out ost);
    if(i==0 | ost==0 ) {
     Console.WriteLine(res);
     outFile.WriteLine(res);
     } 
    i++;
   } // while
К сожалению, на экране и в файле пропадают русские буквы. Как с этим бороться?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 01-12-2006 23:50 » 

Я думаю тут проблема в недопонимании. Что значит пропадают? Вместо них пустые места появляются? Или размер уменьшается на количество русских букв? Или вместо привычных А и Б ты видишь кракозябры?

Смотри, в принципе не существует БУКВ ни русских, ни каких-либо других. Есть только коды. Или ещё лучше сказать байты информации. Как эти байты интерпретируются той, или иной программой, или системой, к самим кодам не имеет никакого отношения.

Например у тебя есть исходный файл содержащий след. байты информации (шестнадцатеричная запись, пробел просто для разделения):

41 42 98 99 А1 А2 А3

Если после считывания и перезаписи ты получил именно эту последовательность, или те же самые байты. То  сам  алгоритм и функции перезаписи работают правильно. Поэтому, чтобы быть в этом абсолютно уверенным обеспечь отображение кодов рядом с символами, например:

0х41 : А
0х42 : B
...

Или открой полученный файл в HEX-редакторе.

Если же байты перелопачены - вместо АВ стоит СА, то тогда надо смотреть уже сам алгоритм. Особенно промежуточные преобразования. Хотя я их у тебя не вижу. Поэтому, скорее всего виновато отображение полученных кодов. Те ты получашь коды, которые в одинх условиях соответствуют русским буквам, но они не могут быть отображены как таковые. Например в консольном приложении всё зависит от выбранной кодировки, в текстовом редакторе о выбранного шрифта и тд (хотя, как в принципе и везде в винде).
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 02-12-2006 10:34 » 

А вывод в консоль в винде разве не в другой кодировке идет? Может стоит обратить внимание...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 02-12-2006 12:54 » 

В консоле в OEM. API-шная ф-я CharToOem это делает.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tumanovalex
Помогающий

ru
Offline Offline

« Ответ #4 : 02-12-2006 13:28 » 

Крокозябры меня бы не удивили, я знаю, что в консоле выводится строка в кодировке DOS. Но в моем случае вместо русских букв вообще ничего нет, а если после русских букв стоят английские, то впечатление такое, что русские буквы заменены на пробелы.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 02-12-2006 13:38 » 

tumanovalex, кинь оригинал и полученный файл на мыло.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tumanovalex
Помогающий

ru
Offline Offline

« Ответ #6 : 02-12-2006 14:08 » 

Спасибо большое за желание помочь, самому мне разобраться будет тяжело, недостаточно опытен. Файлы и проект скинул.
Записан
RomCom
Опытный

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 04-12-2006 00:15 » 

Я так понимаю надо конвертить из ASCII  в 866-ю:
Код:
res= Encoding.GetEncoding(866).GetString(Encoding.Convert(Encoding.ASCII,
                Encoding.GetEncoding(866), Encoding.ASCII.GetBytes(res)));
Записан

R.O.M.C.O.M.: Robotic Operational Mathematics and Ceaseless Observation Machine
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines