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


Автор: libertas 10.4.2014, 08:52
Всем привет. 

Подскажите, пожалуйста, почему так работает код:

Код

import java.io.*;

public class IO {
    public static void main(String[] args) {
        try {
            BufferedReader br =
                    new BufferedReader(new InputStreamReader(System.in, "Cp866"));
            PrintWriter pw = new PrintWriter(
                    new OutputStreamWriter(System.out, "Cp866"), true);
            String s = "Это строка с русским текстом";
            System.out.println("System.out  puts: " + s);  
            pw.println("PrintWriter  puts: " + s);        

            int c = 0;
            pw.println("Посимвольный ввод:");
            while ((c = br.read()) != -1)              // Пока не <Ctrl>+<Z>
                pw.println((char) c + " -> " + c);

          } catch (Exception e) {
            System.out.println(e);
        }
    }
}



Код

       System.out.println("System.out  puts: " + s);  
       pw.println("PrintWriter  puts: " + s);   


Если выводить это через Intellij IDEA 
то выводится так:

System.out  puts: Это строка с русским текстом
PrintWriter  puts: �� ��ப� � ���᪨� ⥪�⮬


Если использовать консоль, то иероглифы и там и там? 
Почему так и почему по-разному?

Дальше посимвольный ввод:
 
Код

 pw.println("Посимвольный ввод:");
            while ((c = br.read()) != -1)              // Пока не <Ctrl>+<Z>
                pw.println((char) c + " -> " + c);

 через Intellij IDEA 
если ввести русскую букву, то
а
� -> 9576
� -> 9617

 -> 10

а английскую:
f -> 102

 -> 10

Почему для русского варианта выводится 2 строки, а для русского одна?

При этом в консоли:

f -> 102
 -> 13

 -> 10

а
а -> 1072
 -> 13

 -> 10
 
Почему есть разница в выводе в консоли и intellij idea?
И ещё в intellij idea если нажимать <Ctrl>+<Z> программа не прерывается.

Спасибо.

Автор: LSD 10.4.2014, 10:59
System.out это стандартный поток вывода, в общем случае это бинарный поток, но многие программы трактуют его как символьный вопрос только насчет кодировки символов. IDEA ставит умолчальной кодировкой UTF-8 и ожидает что текст в консоль будет писаться в UTF-8 а не 866, потому стандартный PrintWriter который ассоциирован с System.out работает нормально. 

Что касается консоли Windows, то сама консоль работает в 866 кодировке, и вобще говоря OutputStreamWriter с Cp866 должен отрабатывать нормально, если только ты руками кодировку в консоли не менял. А стандартный PrintWriter который ассоциирован с System.out работает в умолчальной кодировке системы, которая 1251, потому там кракозябры.

Автор: libertas 10.4.2014, 11:14
Цитата

IDEA ставит умолчальной кодировкой UTF-8 и ожидает что текст в консоль будет писаться в UTF-8 а не 866, потому стандартный PrintWriter который ассоциирован с System.out работает нормально


Цитата

 А стандартный PrintWriter который ассоциирован с System.out работает в умолчальной кодировке системы, которая 1251, потому там кракозябры.


Спасибо.

PrintWriter пишет в UTF-8 или 1251? не очень понял этот момент.

А в консоли у меня для кода 
Код

System.out.println("System.out  puts: " + s);  
       pw.println("PrintWriter  puts: " + s); 
 


System.out  puts: ╨н╤В╨╛ ╤Б╤В╤А╨╛╨║╨░ ╤Б ╤А╤Г╤Б╤Б╨║╨╕╨╝ ╤В╨╡╨║╤Б╤В╨╛╨╝
PrintWriter  puts: Р?С?Р? С?С?С?Р?РєР° С? С?С?С?С?РєРёР? С?Р?РєС?С?Р?Р?

Я не менял кодировку.

И почему для символьного ввода для русских и английских букв выводится разное количество строк для одного кода:
Код

pw.println("Посимвольный ввод:");
            while ((c = br.read()) != -1)              // Пока не <Ctrl>+<Z>
                pw.println((char) c + " -> " + c);

Автор: LSD 10.4.2014, 13:26
Цитата(libertas @  10.4.2014,  12:14 Найти цитируемый пост)
PrintWriter пишет в UTF-8 или 1251?

Смотря какой. Тот который по умолчанию стоит в System.out пишет в умолчальной кодировке: при запуске из консоли это будет 1251, при запуске из IDEA будет UTF-8. Если ты сам создаешь PrintWriter то ты и задаешь для него кодировку.



Цитата(libertas @  10.4.2014,  12:14 Найти цитируемый пост)
А в консоли у меня для кода 

Запиши строку в файл в некой кодировке (например 1251). Возможно у тебя неправильная кодировка при компиляции. Т.е. файл в UTF-8, а компилятор работает с умолчальной системной.

Автор: libertas 10.4.2014, 14:01
Ок, спасибо большое. Буду эксперементировать.

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