2012-03-13 4 views
1

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

Теперь, чтобы написать вывод, я преобразовываю его в массив байтов, используя 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"); 

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

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

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

ответ

1

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

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

+0

Спасибо большое Durandal! Определенно многое происходило. И я почти слепой, чтобы не видеть их! Строка была закодирована с использованием URLEncoder.encode (данных), и все, что мне нужно было сделать, это использовать URLDecoder.decode (данные), чтобы вернуть мои исходные данные. – mawia

4

Используйте 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); 
} 
+0

попробовал это, но, к сожалению, с тем же результатом. Более того, я не могу изменить кодировку, потому что мы отправляем это на сторонний сервер, который довольно успешно выполняет свою задачу. Мне нужно расшифровать тестовую утилиту, которая записывается для проверки данных, отправляемых на этот сервер, перед тем как положить это на prod. Поэтому вы можете понять, что мое творчество ограничено для чтения данных и не может изменить код записи. – mawia

3

Ваш пример работает на моей машине (исправление некоторых опечаток там, как отсутствующий и GetBytes вместо GetByte). Вы пытались заставить кодировку чем-то вроде:

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

?

Смежные вопросы