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


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

Код

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


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


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


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



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

Автор: Egorik789 2.11.2009, 13:44
ivanovpv, А можно более подробнее..?

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


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

Автор: Egorik789 3.11.2009, 15:07
ivanovpv
Я сделал вот так..
InputStream is = process.getInputStream();
InputStreamReader reader = new InputStreamReader(is,"Cp1251");

Но я не могу считать теперь данные..
Или просто не знаю как..
Помоги пожалуйста..?

Автор: ivanovpv 3.11.2009, 15:25
А что же ты теперь читаешь? Надо теперь читать reader ...

И еще ты хоть спроси у системы http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html#isSupported%28java.lang.String%29 твой чарсет? 

Автор: Egorik789 3.11.2009, 15:28
ivanovpv
Вот это дальше не работает..

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

Чарсет понимает..

Автор: ivanovpv 3.11.2009, 15:40
Приведи весь код

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

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

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

Автор: ivanovpv 3.11.2009, 16:15
Жесть...
Код

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

Автор: Egorik789 4.11.2009, 05:58
ivanovpv, Огромное спасибо!)))
Я разобрался..!!)))
 this.isr = new InputStreamReader(is, "cp1251");
      sw = new StringWriter();
Там так должно быть..)))

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