Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кодировки, не понимаю как работает код 
:(
    Опции темы
libertas
Дата 10.4.2014, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.3.2014

Репутация: нет
Всего: нет



Всем привет. 

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

Код

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> программа не прерывается.

Спасибо.
PM   Вверх
LSD
Дата 10.4.2014, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
libertas
Дата 10.4.2014, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.3.2014

Репутация: нет
Всего: нет



Цитата

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);

PM   Вверх
LSD
Дата 10.4.2014, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(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, а компилятор работает с умолчальной системной.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
libertas
Дата 10.4.2014, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.3.2014

Репутация: нет
Всего: нет



Ок, спасибо большое. Буду эксперементировать.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.