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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DOS->Win, кодировка 
V
    Опции темы
Antropoid
Дата 18.7.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Есть строка из русских букв, правильно отображающаяся в консольке; напечатать ее же в Окне Приложения(напр. в JTextArea). 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
LSD
Дата 18.7.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Телепаты в отпуске! Опиши проблему подробно, и начни с того какая ОС. 


--------------------
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   Вверх
Antropoid
Дата 19.7.2006, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Ну тогда смотри:
В файле "DataUsers" есть предложение на руссском языке и ...
Код

        RandomAccessFile DataUsers = new RandomAccessFile("DataUsers","rw");
        byte b[] = new byte[(int)DataUsers.length()];
        DataUsers.read(b,0,(int)DataUsers.length());
                    String s = new String(b);
        System.out.println(s);//Строка, правильно отображающаяся в консольке

напечатать строку "s", в JTextArea. ОС - Windows XP(но нужно, чтоб работало и под *nix).
 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
LSD
Дата 19.7.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Проблема в том, что по умолчанию консоль в XP, по умолчанию имеет кодировку Cp866, а у системы умолчальная кодировка Cp1251. Отсюда выводы:
1. У тебя неправильная кодировка исходников. У тебя исходники сохранены в кодировке Cp866, а компилируешь ты их как исходники в Cp1251. Надо или изменить кодировку исходников, или при компиляции указывать что они в Cp866.

2. Чтобы в консоли все нормально отображалось, надо или изменить кодировку консоли: в консоли набрать ChCp 1251 и установить для консольного окна шрифт LucidaConsole. Или указать Java что у системы умолчальная кодировка Cp866: запускать с параметром -Dfile.encoding=Cp866. 


--------------------
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   Вверх
NextAlex
Дата 21.7.2006, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

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



можно так:
Код

        String InEncoding = "Cp1251", OutEncoding = "Cp866"
        String res = "";
             try{                                                          
               res = new String(s.getBytes(InEncoding), OutEncoding );
             }catch(UnsupportedEncodingException e){
            System.err.println("Unsupported encoding \n" + e);
        }
        System.out.println(res);

у меня работало при выводе на экран в графике, думаю должно работать и с консолью.
кроме того можно создать файл настроек программы и вбить туда InEncoding и OutEncoding дабы не париться потом
  

Это сообщение отредактировал(а) NextAlex - 21.7.2006, 22:46
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
LSD
Дата 22.7.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(NextAlex @  21.7.2006,  23:45 Найти цитируемый пост)
можно так:
...

Плохое решение: двойное перекодирование, если InEncoding не поддерживает часть символов, а OutEncoding их поддерживает, то мы их потеряем (они будут заменены на знаки вопроса).
Да и вообще это неправильно, порождать неправильно декодированную строку, чтобы она нормально отобразилась в неправильно настроенный PrintWriter. Уж лучше создать свой собственный:
Код
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(System.out, consoleCharset));



Вобще, эти способы плохи тем, что порождают разный код под разные ОС. А поскольку проблема в ОС, то и решать ее надо на уровне ОС. 


--------------------
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   Вверх
NextAlex
Дата 22.7.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

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



Цитата(LSD @  22.7.2006,  00:37 Найти цитируемый пост)
 А поскольку проблема в ОС, то и решать ее надо на уровне ОС. 

позволь не согласиться - задача Antropoid как программера не состоит в настройке системы под которой будет работать программа - в данном случае ему нужна прога с максимальной гибкостью, работа которой (в идеале) не зависит от настроек операционки. Так что пока твой вариант с PrintWriter максимально приближен к цели. Кстати я раньше где-то встречал определение кодировки консоли ... щас поищу 
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Antropoid
Дата 22.7.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Вы знаете, мне вариант NextAlexa больше нравится. Не понятны возражения LSD:  двойное перекодирование, если InEncoding не поддерживает часть символов, а OutEncoding их поддерживает, то мы их потеряем (они будут заменены на знаки вопроса). В моем случае InEncoding = Cp866, а Outcoding  = Cp1251,-  в моем приложени работа будет производится с русскими буквами и с арабскими( smile ) цифрами,поэтому проблем с перекодированием возникнуть не должно... 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
LSD
Дата 22.7.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(NextAlex @  22.7.2006,  14:47 Найти цитируемый пост)
позволь не согласиться - задача Antropoid как программера не состоит в настройке системы под которой будет работать программа - в данном случае ему нужна прога с максимальной гибкостью, работа которой (в идеале) не зависит от настроек операционки.

Такая проблема, есть только под Windows и только с некоторыми языками. В английской версии все будет нормально (и там и там ASCII), равно как и в Linux (там кодировки совпадают). Если вывод перенаправить в файл, то таких проблем тоже не будет. Это именно косяк Windows, консольные Windows приложения тоже сталкиваются с такой проблемой. Поэтому я и считаю, что "лечить" надо Windows, а не программу.


Цитата(NextAlex @  22.7.2006,  14:47 Найти цитируемый пост)
Кстати я раньше где-то встречал определение кодировки консоли ... щас поищу

А вот это интерестно, единственное, что я на эту тему слышал, так это java.io.Console из JDK 1.6.

Добавлено @ 14:59 
Цитата(Antropoid @  22.7.2006,  15:45 Найти цитируемый пост)
Не понятны возражения LSD:  двойное перекодирование, если InEncoding не поддерживает часть символов, а OutEncoding их поддерживает, то мы их потеряем (они будут заменены на знаки вопроса). В моем случае InEncoding = Cp866, а Outcoding  = Cp1251,-  в моем приложени работа будет производится с русскими буквами и с арабскими(  ) цифрами,поэтому проблем с перекодированием возникнуть не должно... 

С цифрами и буквами проблем быть не должно, а вот с другими символами очень может быть.

Запусти в консоли:
Код
import java.io.*;

public class Test
{
  public static void main(String[] agrs) throws Exception
  {
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(System.out, "Cp866"));
    String s1 = "\u2554\u2566\u2557";
    String s2 = "\u2560\u256C\u2563";
    String s3 = "\u255A\u2569\u255D";
    printWriter.println(s1);
    printWriter.println(s2);
    printWriter.println(s3);
    printWriter.flush();

    String InEncoding = "Cp1251", OutEncoding = "Cp866";
    System.out.println(new String(s1.getBytes(InEncoding), OutEncoding));
    System.out.println(new String(s2.getBytes(InEncoding), OutEncoding));
    System.out.println(new String(s3.getBytes(InEncoding), OutEncoding));
  }
}
 


--------------------
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   Вверх
NextAlex
Дата 26.7.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

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



не нашел я определение кодировки консоли ...
может просто с чем-то перепутал ... smile 
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
Antropoid
Дата 27.7.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Ну и не надо - вопрос-то уже решенный! 


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
dipsy
Дата 30.10.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно поменять кодировку файла. Пытаюсь сделать вышеописанным методом:
Код

        String InEncoding = "Cp1251", OutEncoding = "UTF-8";
        int i=0;
        while ((line = br.readLine()) != null ){
            if (i>0){
                l_FileW.write( new String(line.getBytes(InEncoding), OutEncoding ) +"\r\n");
            } else {
                l_FileW.write("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n");
            }
            i++;
        }

но в результате все русские символы заменяются на знаки вопроса. в чём ошибка?
PM MAIL WWW   Вверх
LSD
Дата 30.10.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Код
String inEncoding = "Cp1251", outEncoding = "UTF-8";
Reader reader = new InputStreamReader(new FileInputStream("input.txt"), inEncoding);
Writer writer = new OutputStreamWriter(new FileOutputStream("output.txt"), outEncoding);
char[] buffer = new char[16 * 1024];
int read;
while((read = reader.read(buffer)) != -1)
  writer.write(buffer, 0, read);
reader.close();
writer.close();



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

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

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


 




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


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

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