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


Автор: develjar 29.5.2016, 10:50
При открытии txt файла в консоли NetBeans, английские буквы отображаются нормально, а русский получаются символами, как сделать нормальную кодировку и вывод этого всего в JTextArea, а не в консоль?

Код: 

Код

mi1.addActionListener(new  ActionListener(){
            @Override
            public void actionPerformed(ActionEvent event) {
               JFileChooser fileopen = new JFileChooser();
            int ret = fileopen.showDialog(null, "Открыть файл");                
            if (ret == JFileChooser.APPROVE_OPTION) {             
            }
            File f = fileopen.getSelectedFile();
            try(FileReader reader = new FileReader(f)) 
         {
          char[] buffer = new char[(int)f.length()];
            reader.read(buffer);
            System.out.println(new String(buffer));
         }
         catch(IOException tx){
           System.out.println(tx.getMessage());
        }
            }        
      });

Автор: LSD 30.5.2016, 11:47
Вместо FileReader использовать InputStreamReader и явно указать ему правильную кодировку.

Автор: develjar 31.5.2016, 12:27
Цитата(LSD @ 30.5.2016,  11:47)
Вместо FileReader использовать InputStreamReader.


Заменил. Выдает ошибку в  строке  которую заменил

Код: 

mi1.addActionListener(new  ActionListener(){
            @Override
            public void actionPerformed(ActionEvent event) {
               JFileChooser fileopen = new JFileChooser();
            int ret = fileopen.showDialog(null, "Открыть файл");                
            if (ret == JFileChooser.APPROVE_OPTION) {             
            }
            File f = fileopen.getSelectedFile();
            try (Reader reader = new InputStreamReader(new FileInputStream(pathToFile), <encoding>)) 
         {
          char[] buffer = new char[(int)f.length()];
            reader.read(buffer);
            System.out.println(new String(buffer));
         }
         catch(IOException tx){
           System.out.println(tx.getMessage());
        }
            }        
      });

Автор: LSD 31.5.2016, 15:08
Цитата(develjar @  31.5.2016,  13:27 Найти цитируемый пост)
Выдает ошибку в  строке  которую заменил

Исправь ошибку.

Автор: develjar 31.5.2016, 16:11
Цитата(LSD @ 31.5.2016,  15:08)
Исправь ошибку.

try (Reader reader = new InputStreamReader(new FileInputStream(), "UTF-8"))

файл должен указываться вручную .

Автор: SVN74 31.5.2016, 17:21
Цитата(develjar @  29.5.2016,  10:50 Найти цитируемый пост)
английские буквы отображаются нормально, а русский получаются символами, как сделать нормальную кодировку

Ничего не надо было менять, просто в вывод надо было добавить перекодировку, кодировку надо подбирать...
System.out.println(new String((new String(buffer)).getBytes("cp1251")));

Автор: develjar 31.5.2016, 19:01
Цитата(SVN74 @ 31.5.2016,  17:21)
Цитата(develjar @  29.5.2016,  10:50 Найти цитируемый пост)
Ничего не надо было менять


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

JTextArea tx = new JTextArea (30,50);
tx.read( new FileReader( f.getAbsolutePath() ), null );

Автор: SVN74 31.5.2016, 23:31
По видимому у вас кодировка файла "windows-1251", вот набросал для, работает с JTextArea...
Код

FileInputStream fis = new FileInputStream("my.txt");
InputStreamReader isr = new InputStreamReader(fis, "cp1251");
char[] c = new char[fis.available()];
int x = isr.read(c);
String str = new String(c,0,x);

Автор: develjar 1.6.2016, 12:56
Цитата(SVN74 @ 31.5.2016,  23:31)
Код

FileInputStream fis = new FileInputStream("my.txt");
InputStreamReader isr = new InputStreamReader(fis, "cp1251");
char[] c = new char[fis.available()];
int x = isr.read(c);
String str = new String(c,0,x);

И в чем разница с этим кодом? 

Код:

            File f = fileopen.getSelectedFile();
           try (Reader reader = new InputStreamReader(new FileInputStream(f), "Cp1251"))
                   {             
             char[] buffer = new char[(int)f.length()];
            reader.read(buffer);           
             tx.read( new FileReader( f.getAbsolutePath() ), null );
         }
         catch(IOException tx){
           System.out.println(tx.getMessage());
        }
            }        
      });



Автор: LSD 1.6.2016, 17:27
Цитата(SVN74 @  31.5.2016,  18:21 Найти цитируемый пост)
System.out.println(new String((new String(buffer)).getBytes("cp1251")));

НИКОГДА так не делайте. Если у вас "кракозябры" в String, то исправлять надо метод которые читает данные из байтов, а не костылить строки.


develjar, 
1. Начни уже пользоваться тегами [Код], невозможно же читать.
2. Зачем ты вначале создаешь Reader reader, а потом упорно продолжаешь как и раньше tx.read(new FileReader(f.getAbsolutePath() ), null); ?

Автор: develjar 1.6.2016, 21:06
Цитата(LSD @ 1.6.2016,  17:27)
 Зачем ты вначале создаешь Reader reader, а потом упорно продолжаешь как и раньше tx.read(new FileReader(f.getAbsolutePath() ), null); ?

Это нашел в примере как сделать,оттуда скопировал, по этому ни чего не могу сказать  smile 

Автор: SVN74 1.6.2016, 22:10
Цитата(develjar @  1.6.2016,  12:56 Найти цитируемый пост)
Цитата(SVN74 @ 31.5.2016,  23:31)
FileInputStream fis = new FileInputStream("my.txt");
InputStreamReader isr = new InputStreamReader(fis, "cp1251");
char[] c = new char[fis.available()];
int x = isr.read©;
String str = new String(c,0,x);

И в чем разница с этим кодом? 

Разница в том, что это работает.... smile
Взят файл с соответствующей кодировкой для проверки 
Если добавить ...       tx.setText(str); , все отображается правильно...



Автор: develjar 2.6.2016, 12:00
Цитата(SVN74 @ 1.6.2016,  22:10)
все отображается правильно...

Да, правильно.

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