Специальные символы в строке Java - PullRequest
0 голосов
/ 04 сентября 2018

Я ищу решение для вставки специальных 1-байтовых символов в строку Java, например 0xFE, 0xFF ( > 127).

Мне нужно использовать String вместо байтового массива, потому что методу класса нужен только тип String.

Что мне нужно в String = {0x07 0xAA 0x03 FF}. Да, это специальные символы, которые используются для управления устройством.

И я попытался использовать String constructur как:

byte[] arr = {0x07, (byte) 0xAA, 0x03, (byte) FF};
String s = new String(arr, "UTF-8"); 

// utf-8 использует для 1-байтовых символов, а также я пробовал ascII, но результат был тот же

Все работает до значения 127 (dec) char в массиве, но после того, как он дает странный результат, такой как 1 или 2 дополнительных байта в String, это, конечно, происходит, потому что тип байта имеет максимальное значение 127. Но как исправить эту ситуацию? ? Нужна помощь.

Как я понял, я не могу добавить char [] в конструктор String

1 Ответ

0 голосов
/ 04 сентября 2018

Одна часть вашего вопроса неверна. UTF-8 сохраняет только печатаемые символы ASCII в диапазоне [32,126] как отдельные байты (за исключением того, что это 2 или даже 3 байта на символ), даже если кодировки обычно имеют длину 256 байтов. Поскольку в Java все строки автоматически сохраняются и печатаются как UTF-8 по умолчанию, при печати они сохраняют более 1 байта.

Вам нужна кодировка, которая хранит все [1,256] первых байтов как отдельные байты при доступе к байтам. Например, с вашим текущим кодом:

byte[] arr = {0x07, (byte) 0xAA, 0x03, (byte) 0xFF};
String s = new String(arr, "UTF-8");

System.out.println(s.getBytes().length); // This prints 8
System.out.println(s.getBytes("UTF-8").length); // This prints 8 as well (since the default is UTF-8)
System.out.println(s.getBytes("Windows-1252").length); // This prints 4

Попробуйте онлайн.

ISO-8859-1 (также известный как Кодовая страница 1252 или Windows-1252 ) или Кодовая страница 437 - две довольно известные кодировки.

...