Байт в строку |Джава - PullRequest
       3

Байт в строку |Джава

1 голос
/ 13 марта 2012

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

Теперь, чтобы записать вывод, я преобразую его в байтовый массивиспользуя string.getByte ().Теперь во время чтения строка формируется с помощью конструктора String (byte []).

Сказав это, вопрос здесь в том, что прочитанная строка - это не то, что мне хотелось бы видеть.В то время как все буквенно-цифровые символы читаются в том виде, в котором они были, но для других специальных символов в записанной строке их значение ASCII печатается с предшествующим символом%.

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

    private stringToByte(){
      String data="\"X=Y;Z=A;B=C;\""
      byte[] byteArray=data.getByte();
      String readData=new String(byteArray);
      System.out.println("data:"+readData);
     }

дает тот же результат.Теперь строка, генерируемая после этого, выглядит как

   data:%22X=Y%3BZ=A%3BB=C%3B%22

Теперь я исходил из того, что кодирование выполняется с использованием набора символов по умолчанию, поэтому оно должно быть и кодированием.Но такое поведение очевидно даже на той же машине в той же JVM.

Я пытался идти вразрез, используя

    String readData=new String(byteArray,"diffent character set name");

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

Надеюсь, вы притормозите меня этим сглазом. Можете ли вы указать, куда я иду глупо в этой схеме?

Большое спасибо заранее!:)

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Используйте Charset.forName (...) следующим образом. Вы также можете запросить доступные кодировки, например ниже.

String data = "\"X=Y;Z=A;B=C;\"";
byte[] byteArray = data.getBytes(Charset.forName("ISO-8859-1"));
String readData = new String(byteArray, Charset.forName("ISO-8859-1"));
System.out.println("data:" + readData);

for (String name : Charset.availableCharsets().keySet()) {
    System.out.println(name);
}
3 голосов
/ 13 марта 2012

Ваш пример работает на моей машине (исправляя некоторые опечатки там, например пропущенные; и getBytes вместо getByte). Вы пытались принудительно закодировать что-то вроде:

byte[] byteArray=data.getBytes(Charset.forName("UTF-8"));
String readData=new String(byteArray, Charset.forName("UTF-8"));    

1 голос
/ 13 марта 2012

Ваш пример кода (без опечаток) работает нормально, когда я тестирую его на своей машине. Кроме того, понятие% XX для специальных символов предполагает, что происходит гораздо больше, чем вы описываете, это больше похоже на Процентное кодирование . И это совсем не похоже на то, что это вызвано String.getBytes ().

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

...