2013-06-14 3 views
0

В Java я пытаюсь преобразовать байт массива (byte[]) XML в строку с помощью:Преобразование массива байтов (байт []) в строку меняет один специальный символ

String output = new String(myXMLbyteArray, "UTF-8"); 

Это успешно, за исключением одного особый характер, острый апостроф. При сравнении входных и выходных данных в шестнадцатеричном у меня есть это:

Например:

  • 40 становится 40 00
  • 55 становится 55 00

Но особый характер 92 становится 19 20 вместо 92 00 ,

Как я могу исправить это элегантно? Я попробовал как конструктор String по умолчанию, так и другие кодировки без везения.

+0

Можете ли вы дать более четкий пример того, что вы делаете, потому что '92' становится' 19 20' не имеет смысла, а не '92 00' Например, с UTF-8 и большинством кодировок' 40' становится '40 'т.е. это ASCII и не изменен. –

+0

Когда я открываю входной текст (byte []) с шестнадцатеричным редактором, например, у символа есть шестнадцатеричное значение 55. Когда я открываю выходной текст (String), этот символ теперь имеет значение 55 00, так как символ в Java - 2 байта. Вот почему вы ожидали бы, что 92 станет 92 00, однако оно станет 19 20, что является другим (недопустимым) символом. – user2381303

+0

55 все еще 55, но на самом деле это 0055, порядок байтов - это аппаратная деталь, не указанная Java. То, что 92 переведено, зависит от вашей кодировки. Это может быть 0092, если вы используете ISO-8859-1, но если вы используете UTF-8, это начало многобайтового символа, поэтому ему нужно посмотреть на следующий символ, чтобы превратить его в один символ. –

ответ

0

Я подозреваю, что вы хотите ISO-8859-1, который переводит 0-255 в 0-255 как есть. Это означает (байт) 92 => (char) 92

Вы не можете сказать, что 55 становится 55 00, поскольку это не два байта, к которым вы можете получить доступ индивидуально, это один символ, который будет 0055 или всего 55, если вы напечатаете это как шестигранный.

+0

Я сейчас попробовал ISO-8859-1, но получил точно такой же результат. Я также попробовал US-ASCII и получил тот же результат. Я также пробовал UTF-16, UTF-16LE и UTF16-BE, но я не смог получить какой-либо результат, так как это нарушило вызов сервера. Я думаю, что это связано с преобразованием байта [] в строку, то есть каждого байта, на символ, а не на кодировку. – user2381303

+0

Кодирование - это преобразование из байта [] в строку. Можете ли вы представить реальный пример, который я могу запустить, чтобы воспроизвести вашу проблему? т.е. фактический код Java. –

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