Вы запутались, смешав несколько понятий.
Прежде всего, int 128 совпадает с байтом -128 (int 255 == байт -1, 254 == -2, ..128 = -128).Байты подписаны , а информация знака находится в старшем бите.Ваша ошибка здесь в том, что вы не использовали правильный способ преобразования байтового значения обратно в int.Чтобы исправить это, используйте этот код:
b = (byte) 128;
int i = b & 0xff;
System.out.println(b);
System.out.println(i);
дает -128
и 128
.
Далее: ASCII определен только для значений от 0 до 127. Это означает что-либо> 127является мусором, если вы не обращаетесь с ним осторожно.
Проблема в том, что вы читаете вывод вашего кода.Поскольку ASCII не может содержать значения> 127, что должен делать код чтения?
«output.js» звучит так, как будто вы используете веб-браузер для чтения этих данных в виде файла JavaScript.Веб-браузер попытается преобразовать поток байтов в текст, используя «кодировку».Вы не указываете его, браузер должен угадать и ошибиться (и application/octet-stream
тоже кажется неправильным. Разве это не должно быть text/javascript
?).
У вас есть два варианта:
Измените encode()
, чтобы он возвращал правильно закодированную строку UTF-8 (UTF-8 - это способ отправки юникода в виде байтов) и установите для charset значение UTF-8
(обычно этопо умолчанию, но лучше быть безопасным, чем потом сожалеть):
response.setHeader("Content-Type", "text/javascript; charset=UTF-8");
Установите кодировку на ISO-8859-1
, что сохранит байты 1: 1.Это не удастся, если ваш скрипт содержит какие-либо символы Unicode> 255. Поскольку ошибки не будет, вы должны , а не использовать этот подход.Я просто упомянул это для полноты.