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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с кодировкой, Чтение из реестра 
V
    Опции темы
Egorik789
  Дата 2.11.2009, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Считываю данные из реестра(тип клавы). 
Нужна настроить правильную кодировку при считывании. Я не знаю только как..
Помогите пожалуйста..
Английские буквы правильно показывает, русские всякие каракулы...

Код

package javaapplication5;
import java.io.*;

public class Main {
private static final String REGQUERY_UTIL = "reg query ";
  private static final String REGSTR_TOKEN = "REG_SZ";
  private static final String REGDWORD_TOKEN = "REG_DWORD";

 private static final String TYPE_KEYBOARD = REGQUERY_UTIL +
       "\"HKLM\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}\\0000\""
       + " /v DriverDesc";

public static String getTypeKeyboard() {
    try {
Process process = Runtime.getRuntime().exec(TYPE_KEYBOARD);
      StreamReader reader = new StreamReader(process.getInputStream()); //<==='в Этом месте надо как-то указать кодировку'

      reader.start();
      process.waitFor();
      reader.join();

      String result = reader.getResult();
      int p = result.indexOf(REGSTR_TOKEN);

      if (p == -1)
         return null;

      return result.substring(p + REGSTR_TOKEN.length()).trim();
    }
    catch (Exception e) {
      return null;
    }
}
static class StreamReader extends Thread {
    private InputStream is;
    private StringWriter sw;

    StreamReader(InputStream is) {
      this.is = is;
      sw = new StringWriter();
    }
@SuppressWarnings("empty-statement")
        @Override
    public void run() {
      try {
        int c;
        while ((c = is.read()) != -1)
          sw.write(c);
        }
        catch (IOException e) { ; }
      }

String getResult() {
      return sw.toString();
    }

public static void main(String s[]) {
 System.out.println("Type Keyboard :" + getTypeKeyboard());
  }
}
}


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


Варвар
**


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

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



Цитата(Egorik789 @  2.11.2009,  06:30 Найти цитируемый пост)
Английские буквы правильно показывает, русские всякие каракулы...


Надо обернуть InputStream в InputStreamReader и в конструкторе InputStreamReader() можно указать чарсет
Код


InputStreamReader isr=new InputStreamReader(is, Charset.forName("Windows-1251"));



forName может выкинуть эксепшн, если чарсет не поддерживается!


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


Новичок



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

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



ivanovpv, А можно более подробнее..?
PM MAIL   Вверх
ivanovpv
Дата 3.11.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


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

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



Цитата(Egorik789 @  2.11.2009,  13:44 Найти цитируемый пост)
А можно более подробнее..? 


Куда уж подробнее то? Оберните сверху ваш InputStream в InputStreamReader, в котором укажите чарсет и все.


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


Новичок



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

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



ivanovpv
Я сделал вот так..
InputStream is = process.getInputStream();
InputStreamReader reader = new InputStreamReader(is,"Cp1251");

Но я не могу считать теперь данные..
Или просто не знаю как..
Помоги пожалуйста..?
PM MAIL   Вверх
ivanovpv
Дата 3.11.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


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

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



А что же ты теперь читаешь? Надо теперь читать reader ...

И еще ты хоть спроси у системы понимает ли он твой чарсет? 


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


Новичок



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

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



ivanovpv
Вот это дальше не работает..

reader.start();
      process.waitFor();
      reader.join();
      String result = reader.getResult()

Чарсет понимает..
PM MAIL   Вверх
ivanovpv
Дата 3.11.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


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

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



Приведи весь код


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


Новичок



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

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



ivanovpv
код полный сверуху.. Я  одну строчку 
StreamReader reader = new StreamReader(process.getInputStream());

заменил на это
InputStream is = process.getInputStream();
InputStreamReader reader = new InputStreamReader(is,"Cp1251");

Помоги.. Я ни как разобраться не могу..

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


Варвар
**


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

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



Жесть...
Код

package javaapplication5;
import java.io.*;
public class Main {
private static final String REGQUERY_UTIL = "reg query ";
  private static final String REGSTR_TOKEN = "REG_SZ";
  private static final String REGDWORD_TOKEN = "REG_DWORD";
 private static final String TYPE_KEYBOARD = REGQUERY_UTIL +
       "\"HKLM\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E96B-E325-11CE-BFC1-08002BE10318}\\0000\""
       + " /v DriverDesc";
public static String getTypeKeyboard() {
    try {
Process process = Runtime.getRuntime().exec(TYPE_KEYBOARD);
      StreamReader reader = new StreamReader(process.getInputStream()); //<==='в Этом месте надо как-то указать кодировку'
      reader.start();
      process.waitFor();
      reader.join();
      String result = reader.getResult();
      int p = result.indexOf(REGSTR_TOKEN);
      if (p == -1)
         return null;
      return result.substring(p + REGSTR_TOKEN.length()).trim();
    }
    catch (Exception e) {
      return null;
    }
}
static class StreamReader extends Thread {
    private InputStreamReader isr;
    private StringWriter sw;
    StreamReader(InputStream is) {
      this.isr = new InputStreamReader(is, "cp1251");
      sw = new StringWriter();
    }
@SuppressWarnings("empty-statement")
        @Override
    public void run() {
      try {
        int c;
        while ((c = isr.read()) != -1)
          sw.write(c);
        }
        catch (IOException e) { ; }
      }
String getResult() {
      return sw.toString();
    }
public static void main(String s[]) {
 System.out.println("Type Keyboard :" + getTypeKeyboard());
  }
}
}



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


Новичок



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

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



ivanovpv, Огромное спасибо!)))
Я разобрался..!!)))
 this.isr = new InputStreamReader(is, "cp1251");
      sw = new StringWriter();
Там так должно быть..)))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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