Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Буква Ш


Автор: gr0shik 30.3.2010, 13:09
Вообщем, вот часть проги( слегка утрированная, но принцип этот)
LineNumberReader StartFile= new LineNumberReader(new BufferedReader(new FileReader("test")));
        PrintWriter EndFile=new PrintWriter(new OutputStreamWriter(new FileOutputStream("test2")));
..........................................
Line=StartFile.readLine();
Line=new String(Line.getBytes("Cp1251"),"Cp866");
if(Line.endsWith("тест")) EndFile.println(Line);


Короч все работает, файл пишется. Но вместо буквы Ш знак ?.
В нете все облазил, видел описание проблемы, а решения так и не нашел(
Как это побороть? 


ЗЫ Я новичек в этом, мудренные фразы мне чужды)

Автор: LSD 30.3.2010, 13:22
Цитата(gr0shik @  30.3.2010,  13:09 Найти цитируемый пост)
new String(Line.getBytes("Cp1251"),"Cp866");

Вот такой ереси в программе вообще не должно быть!

Если тебя надо прочитать файл в одной кодировке и записать в другой, то надо не строку кодировать/раскодировать, а правильно указывать кодировку для Reader/Writer.

Автор: gr0shik 30.3.2010, 13:39
Убрал преобразование.
Сделал вообще так- 
Line=StartFile.readline();
EndFile.println(Line);

То есть записываю то, что прочитал- И снова вместо Ш знак вопроса(

Автор: LSD 30.3.2010, 13:48
Код

  public static void main(String[] args) throws Exception
  {
    LineNumberReader startFile = new LineNumberReader(new BufferedReader(new FileReader("C:\\TEMP\\test1.txt")));
    PrintWriter endFile = new PrintWriter(new OutputStreamWriter(new FileOutputStream("C:\\TEMP\\test2.txt")));
    String line;
    while((line = startFile.readLine()) != null)
    {
      endFile.println(line);
    }
    startFile.close();
    endFile.close();
  }

Все копируется без проблем. Скорее всего нужно просто явно указать кодировку в которой читать и писать данные и проблема решится.

Автор: jk1 30.3.2010, 13:53
Знак вопроса вместо "Ш" появляется в том случае, если вы читаете в кодировке 1251 данные, которые были записаны в 866. 

Приведите, пожалуйста, побольше кода, особенно создание входных/выходных потоков интересует и пример входного файла прикрепите, а то с телепатией у меня сегодня туго.

Автор: gr0shik 30.3.2010, 14:05
LSD Большое спасибо за пример, но мой аналогичный. И как не странно не работает(
Буквы Ш я не вижу.
Фар показывает вин кодировку, НО если файл для считывания написать САМОМУ с буквой Ш, то в и дос и в вин кодировке все работает( создал файл с буквами Ш и пропустил через прогу), я вижу букву Ш.
Но надо считать уже готовый. А вот после его обработки буквы Ш нету. Что-то с файлом может не то?

Я прикреплю часть файла) Сорри за конспирацию- служебные данные, но буква Ш в нем есть и попробуйте пропустить через свою прогу этот файл)

Автор: gr0shik 30.3.2010, 14:31
Короч проблема в большой букве Ш( 98-код), записаной в ДОС кодировке.

Нашел прогу в консоли перегоняет кодировку в нужную, перегнал в вин и все заработало нормуль! Буква Ш как буква Ш.

Автор: LSD 30.3.2010, 16:25
Цитата(LSD @  30.3.2010,  14:48 Найти цитируемый пост)
Скорее всего нужно просто явно указать кодировку в которой читать и писать данные и проблема решится.

Код

  public static void main(String[] args) throws Exception
  {
    BufferedReader startFile = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\TEMP\\test1.txt"), "Cp866"));
    PrintWriter endFile = new PrintWriter(new OutputStreamWriter(new FileOutputStream("C:\\TEMP\\test2.txt"), "Cp1251"));
    String line;
    while((line = startFile.readLine()) != null)
    {
      endFile.println(line);
    }
    startFile.close();
    endFile.close();
  }

Автор: gr0shik 31.3.2010, 11:12
Большое спасибо)
Так куда лучше

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)