Java Строка со встроенным шестнадцатеричным кодированием - PullRequest
0 голосов
/ 17 июня 2020

Я вызываю библиотечный метод, который возвращает объект типа Serializable. В большинстве случаев значение представляет собой простую строку, поэтому я привожу возвращаемое значение в строку. Чтобы получить строку, я делаю следующее:

String val = (String)data.get("MyString");

Однако возникает проблема, когда полученная строка содержит не-ascii. Например, «Køllert», возвращаемое значение отображается как «KxF8llert». «Ø» заменяется на xF8, которое является соответствующим шестнадцатеричным значением Unicode.

Когда я распечатываю значение в байтах, символ печатает как -8.

    byte[] defaultBytes = val.getBytes();
    for(int ii=0; ii<defaultBytes.length; ii++) print((int)defaultBytes[ii]);

Есть ли способ «очистить» возвращаемую строку, чтобы ее можно было распечатать как стандартный Unicode, чтобы символ отображался правильно.

Edit

Когда я ввожу фактическую строку, как показано ниже, строка может быть правильно напечатана, а при проверке байтов символ занимает два байта с целочисленными значениями -61 и -72. Может быть, он возвращает UTF-8 вместо Unicode?

    String val1 = "Køllert";
    byte[] defaultBytes1 = val1.getBytes();
    for(int ii=0; ii<defaultBytes1.length; ii++) print((int)defaultBytes1[ii]);

Решение

Извините, что вопрос был расплывчатым. Мне кажется, что следующее работает. Это не так уж сложно, но у меня закрутилось.

String val = new String(data.get("MyString").getBytes("UTF-8"));

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Я перенесу свой комментарий в качестве ответа, так как он кажется полезным.

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

Следовательно, вместо stringObject.getBytes() - который кодирует вашу строку в последовательность байтов с использованием кодировки платформы по умолчанию, сохраняя результат в новый массив байтов,

вы можете захотеть использовать

stringObject.getBytes("character-encoding") - который кодирует вашу строку в последовательность байтов с использованием заданного character-encoding, сохраняя результат в новый массив байтов.

It кажется, что вам следовало использовать вторую версию выше, так как она закодирует вашу строку в заданную кодировку .

1 голос
/ 17 июня 2020

Может быть, он возвращает UTF-8 вместо Unicode?

Сериализация создает поток байтов. Очевидный, экономичный и без потерь способ превратить строку Java, которая представляет собой последовательность символов Юникода, хранящуюся как UTF-16, в поток байтов, - это преобразовать ее в последовательность символов Юникода, хранящуюся как UTF-8. .

(UTF-16 и UTF-8 являются одинаково допустимыми представлениями Unicode)

Учитывая, что есть преобразование String в сериализованную форму, вы не можете пропустить обратное преобразование сериализованной формы в String.

Почему нет обратного преобразования во всем, что вы использовали для сериализации?

Если мы правы в предположении, что сериализованная форма - это UTF -8, затем для преобразования в строку используйте String(data.get(whatever)). Если это не UTF-8, то это внутреннее дело сериализации кода, и, предположительно, он предлагает дополнительный десериализатор. Строка (что такое приведение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...