Преобразование байтового массива в String (Java)

Я пишу веб-приложение в Google App Engine. Это позволяет людям в основном редактировать html-код, который хранится как .html файл в блочном магазине.

Я использую fetchData для возврата byte[] всех символов в файле. Я пытаюсь распечатать html, чтобы пользователь мог редактировать html-код. Все отлично работает!

Вот моя единственная проблема:

Массив байтов имеет некоторые проблемы при преобразовании обратно в строку. Умные кавычки и несколько персонажей выходят из фанки. (? или japanese символы и т. д.) В частности, это несколько байтов, которые я вижу, которые имеют отрицательные значения, которые вызывают проблему.

Умные кавычки возвращаются как -108 и -109 в массив байтов. Почему это и как я могу декодировать отрицательные байты, чтобы показать правильную кодировку символов?

Байт-массив содержит символы в специальной кодировке (которые вы должны знать). Способ преобразования его в строку:

 String decoded = new String(bytes, "UTF-8"); // example for one encoding type 

By The Way – необработанные байты могут отображаться как отрицательные десятичные числа только потому, что byte данных java-типа подписаны, он охватывает диапазон от -128 до 127.


 -109 = 0x93: Control Code "Set Transmit State" 

Значение (-109) является непечатаемым управляющим символом в UNICODE. Таким образом, UTF-8 не является правильной кодировкой для этого символьного streamа.

0x93 в «Windows-1252» – это «умная цитата», которую вы ищете, поэтому Java-имя этой кодировки – «Cp1252». Следующая строка содержит тестовый код:

 System.out.println(new String(new byte[]{-109}, "Cp1252")); 

Начиная с Java 7 вы также можете передать нужную кодировку в конструктор String в качестве постоянной Charset из StandardCharsets .

Это может быть безопаснее, чем передача кодировки в виде String , как это предложено в других ответах, и вы должны сделать это таким образом, если используете Java 7 или выше.

Пример кодирования UTF-8

 String bytesAsString = new String(bytes, StandardCharsets.UTF_8); 

Вы можете попробовать это.

 String s = new String(bytearray); 
 public class Main { /** * Example method for converting a byte to a String. */ public void convertByteToString() { byte b = 65; //Using the static toString method of the Byte class System.out.println(Byte.toString(b)); //Using simple concatenation with an empty String System.out.println(b + ""); //Creating a byte array and passing it to the String constructor System.out.println(new String(new byte[] {b})); } /** * @param args the command line arguments */ public static void main(String[] args) { new Main().convertByteToString(); } } 

Вывод

 65 65 A 
 public static String readFile(String fn) throws IOException { File f = new File(fn); byte[] buffer = new byte[(int)f.length()]; FileInputStream is = new FileInputStream(fn); is.read(buffer); is.close(); return new String(buffer, "UTF-8"); // use desired encoding } 

Я предлагаю Arrays.toString(byte_array);

Это зависит от вашей цели. Например, я хотел сохранить массив байтов точно так же, как формат, который вы можете видеть во время отладки, что-то вроде этого: [1, 2, 3] Если вы хотите сохранить точно такое же значение без преобразования байтов в формат символов, Arrays.toString (byte_array) делает это. Но если вы хотите сохранить символы вместо байтов, вы должны использовать String s = new String(byte_array) . В этом случае s равно эквиваленту [1, 2, 3] в формате символа.

Предыдущий ответ от Andreas_D хорош. Я просто добавлю, что везде, где вы показываете вывод, там будет шрифт и кодировка символов, и он может не поддерживать некоторые символы.

Чтобы решить, является ли это проблемой Java или ваш дисплей, выполните следующие действия:

  for(int i=0;i 

Java будет отображать любые символы, которые он не может понять, 0xfffd для официального символа для неизвестных символов. Если вы видите '?' на выходе, но он не отображается в 0xfffd, это ваш экранный шрифт или кодировка, это проблема, а не Java.

  • Как это возможно? Сервис работает неограниченно, а также разрешает привязку к андроиду?
  • Должен ли я строго избегать использования перечислений на Android?
  • Как использовать интерфейс для связи между двумя действиями
  • Удалить дубликаты из ArrayLists
  • READ_EXTERNAL_STORAGE разрешение для Android
  • Как проверить, существует ли папка
  • Транзитные зависимости не разрешены для aar-библиотеки с использованием gradle
  • Обновление Eclipse с помощью средств разработки Android v. 23
  • Библиотека FFT в android Sdk
  • Преобразование UTC в текущее время локали
  • Пользовательский макет для DialogFragment OnCreateView и OnCreateDialog
  • Interesting Posts

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

    При написании директивы в AngularJS, как я могу решить, нужна ли мне новая область, новая область для детей или новая изолированная область?

    Редактор не содержит основного типа

    Сортировка текста по значению в Notepad ++

    Система очередей Linux

    Тип для даты только в C # – почему нет типа даты?

    Как изменить видеоконтейнер без повторного кодирования или сжатия файла?

    Как преобразовать json в xml с помощью xslt

    Запрещено название пакета: java

    Любые хорошие инструменты ORM для разработки Android?

    Многократное наследование Java

    Как проверить, вызывает ли вызов функции предупреждение?

    Преобразование столбцов data.frame из коэффициентов в символы

    Как очистить память, чтобы предотвратить «ошибку из памяти» в excel vba?

    Показать форму без кражи фокуса?

    Давайте будем гением компьютера.