Java: байтовый массив выводит неизвестные значения для одной и той же строки

#java #arrays #encoding #character-encoding

#java #массивы #кодирование #кодировка символов

Вопрос:

У меня есть следующее String , которое хранится в текстовом файле, а также в качестве переменной в Java: ‘destructive’

Мой код ниже

 public class SimpleTest {

    public static void main(String[] args) {
        try {
            File file = new File("TestFIle.txt");
            byte[] file_encoded = FileUtils.readFileToString(file, "UTF-8").getBytes("UTF-8");
            System.out.println(Arrays.toString(file_encoded));

            String toEncrypt = "‘destructive’";
            byte[] encoded = toEncrypt.getBytes(Charset.forName("UTF-8"));
            System.out.println(Arrays.toString(encoded));
        } catch (IOException ex) {
            Logger.getLogger(SimpleTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
  

Как вы можете видеть

 String toEncrypt = "‘destructive’";
  

Содержимое в TestFIle.txt это также: ‘разрушительный’

Когда я запускаю код, я получаю:

 [-17, -69, -65, -30, -128, -104, 100, 101, 115, 116, 114, 117, 99, 116, 105, 118, 101, -30, -128, -103]
[-30, -128, -104, 100, 101, 115, 116, 114, 117, 99, 116, 105, 118, 101, -30, -128, -103]
  

Что является дополнительным [-17, -69, -65] в начале байтового массива при чтении одного и того же текста из файла и почему я это получаю?

Ответ №1:

Похоже, что ваш файл содержит текст, закодированный в UTF-8 с начальным знаком порядка байтов (BOM). Спецификация для UTF-8 — EF BB BF . В представлении дополнения two это -17 -69 -65.

Ответ №2:

Ведущим [-17, -69, -65] является знак порядка байтов UTF-8. В шестнадцатеричном формате спецификация [0xEF, 0xBB, 0xBF] — это то, что есть на самом деле [239, 187, 191] . Но поскольку Java byte имеет знак, числа интерпретируются (и печатаются) как отрицательные числа.

В общем, спецификация является необязательной и, похоже, распространена в экосистеме Microsoft: https://superuser.com/questions/1553666/utf-8-vs-utf-8-with-bom