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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неверная кодировка при компиляции, При компиляции неверно отображает лат. 
:(
    Опции темы
lkiryxa
Дата 7.9.2010, 00:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет.
Я очередной чайник с своими примитивными вопросами, но тем не менее прошу помощи у опытных гуру.
При компиляции самой первой программы :

class Hello {
    public static void main (String[] args){
        System.out.println ("Привет Мир");
    }
}

Русские символы в консоли отображаются неверно 

user posted image

Подскажите, пожалуйста, что нужно сделать чтобы русские буквы отображались корректно ?
Спасибо

Это сообщение отредактировал(а) lkiryxa - 7.9.2010, 00:09
PM MAIL   Вверх
aleksandy
Дата 7.9.2010, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



PM   Вверх
ivanovpv
Дата 7.9.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

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



На самом деле не все так однозначно...
1) В идеале при компиляции надо указывать кодировку - в вашем случае:
Код

javac -encoding cp1251 Hello.java

2) Но в данном случае это не поможет, поскольку вывод идет на окно с кодировкой 866... Так что результат будет cp1251->cp866

Выхода:
Сразу писать на кодировке 866 (по старому досовская кодировка) и компилировать
Код

javac -encoding cp866 Hello.java


А еще лучше писать на нормальной IDE которая вопросы кодировки решает самостоятельно.



--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Skipy
Дата 7.9.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

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



Цитата(ivanovpv @ 7.9.2010,  16:21)
Выхода:
Сразу писать на кодировке 866 (по старому досовская кодировка) и компилировать
Код

javac -encoding cp866 Hello.java


И это тоже не поможет. Указание кодировки при компиляции нужно для того, чтобы правильно перевести текст в UTF-16BE - кодировку, в которой строки хранятся в памяти.

Для того, чтобы нормально отображался текст в консоли - нужно установить кодировку при выводе в консоль:

Код

System.setOut(new PrintStream(System.out, true, "Cp866"));


P.S. Правда, тогда в IDE будет невесть что. IDE-то показывает Cp1251, как правило...


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
ivanovpv
Дата 8.9.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

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



Цитата(Skipy @  7.9.2010,  18:24 Найти цитируемый пост)
И это тоже не поможет. Указание кодировки при компиляции нужно для того, чтобы правильно перевести текст в UTF-16BE - кодировку, в которой строки хранятся в памяти.

А ты попробуй сначала... и увидишь


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Skipy
Дата 8.9.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

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



Цитата(ivanovpv @ 8.9.2010,  08:10)
А ты попробуй сначала... и увидишь

Ну... Мне вообще-то и пробовать не надо было. Но ради спортивного интереса и чистоты эксперимента попробовал. Написал файл в Cp866, скомпилировал, запустил. Как я и говорил - не работает. При указании -encoding Cp866 та же самая картина. 

А вот БЕЗ указания - работает. Однако это есть следствие компенсации двух ошибок. Первая - байты Cp866 расцениваются как Cp1251 и переводятся совсем не в те символы, в которые должны. Это можно понять, если в байткоде скомпилированного класса найти нужную строку. А при выводе эти символы преобразуются обратно в байты Cp1251. То есть, на самом деле - Cp866. И только поэтому строка отображается правильно.

Можете посмотреть прикрепленный пример. Два класса, во втором установлена кодировка System.out в Cp866. Сначала оба компилируются без указания кодировки, при этом работает первый, из-за компенсации ошибок. Потом оба компилируются с указанием кодировки, при этом в первом случае проблема присутствует, во втором - нет

Код

Compiling without encoding

javac -cp . -d . *.java
Running test 1

java -cp . test.Test
Здравствуй, мир!
Running test 2

java -cp . test.Test2
?¤а ўбвўг?, ?Ёа!
Compiling with encoding

javac -encoding Cp866 -cp . -d . *.java
Running test 1

java -cp . test.Test
╟фЁртёЄтєщ, ьшЁ!
Running test 2

java -cp . test.Test2
Здравствуй, мир!



Это сообщение отредактировал(а) Skipy - 8.9.2010, 10:20

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  sample.rar 0,65 Kb


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
ivanovpv
Дата 8.9.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

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



Цитата(Skipy @  7.9.2010,  18:24 Найти цитируемый пост)
Для того, чтобы нормально отображался текст в консоли - нужно установить кодировку при выводе в консоль:


Ну как оказывается дело то не в этом, а в том, что в исходнике кодировка должна быть такая же как и на консоли.


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
Skipy
Дата 9.9.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

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



Цитата(ivanovpv @ 8.9.2010,  21:34)
Цитата(Skipy @  7.9.2010,  18:24 Найти цитируемый пост)
Для того, чтобы нормально отображался текст в консоли - нужно установить кодировку при выводе в консоль:


Ну как оказывается дело то не в этом, а в том, что в исходнике кодировка должна быть такая же как и на консоли.

Скажите, Вы хоть слово поняли из того, что я написал? Судя по всему нет. 

Объясняю еще раз. То, что в Вашем случае в консоли виден нормальный текст, является следствием наличия ДВУХ ошибок, одна из которых компенсирует другую. Перенесите этот код в Linux - и вывод опять будет испорчен. Просто потому, что кодировка консоли там - не Win1251 и не Cp866. Предлагаете перекодировать исходники и делать сборки под каждую кодировку консоли?

Метод, предложенный мной, позволяет писать исходники в ЛЮБОЙ кодировке и правильно выводить текст на консоль с ЛЮБОЙ кодировкой. 

Это сообщение отредактировал(а) Skipy - 9.9.2010, 09:32


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

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

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


 




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


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

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