#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