Путаница в преобразовании char / int в Java - PullRequest
0 голосов
/ 10 июля 2010

Учитывая этот код в Java:

    FileOutputStream os = new FileOutputStream("/tmp/test.dat");
    os.write(0x14);
    os.write(0xfe);
    os.write(0xae);

    os.write(String.valueOf((char) 0x14).getBytes("UTF-8"));
    os.write(String.valueOf((char) 0xfe).getBytes("UTF-8"));
    os.write(String.valueOf((char) 0xae).getBytes("UTF-8"));

    os.write("\u0014".getBytes("UTF-8"));
    os.write("\u00fe".getBytes("UTF-8"));
    os.write("\u00ae".getBytes("UTF-8"));

    os.close();

Может кто-нибудь объяснить мне, почему первые 3 байта в test.dat

14 fe ae

в то время как выходные данные из последних 6 os.write () равны

14 c3 be c2

В принципе, я хочу буквально вывести байты 14 fe ae. Я хранил эти значения как строковую константу и записывал значение этих констант в файл UTF-8, но вместо этого было выведено 14 c3 be c2. В моем понимании есть пробел в том, как эти байтовые последовательности конвертируются в Java.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 10 июля 2010

Это дает:

0x 14 fe ae 14 c3 be c2 ae 14 c3 be c2 ae

Первые три байта очевидны. Они просто выводятся буквально. Для следующих трех вы должны помнить, что char в Java представляет кодовую единицу UTF-16, а не байт. Итак, вы сначала создаете единицы кода Unicode U + 0014, U + 00FE, U + 00AE, а затем конвертируете каждый в UTF-8. U + 0014 - это 0x14 в UTF-8 (поскольку это также ASCII), но U + 00FE - это 0xC3 0xBE, а U + 00AE - 0xC2 0xAE.

Вы снова создаете те же символы в следующих трех строках.

Суть в том, что если вы хотите хранить буквенные байты, просто используйте байтовый массив.

1 голос
/ 10 июля 2010

"\u00fe" это не байт 0xfe, это кодовая точка Unicode 0xfe, которая при кодировании в UTF-8 может стать многобайтовым значением (как показано выше).

0 голосов
/ 10 июля 2010

Вы пропустили байт: вы должны получить 14 c3 be c2 ae.

Для ваших последних шести вызовов os.write внутренне Java хранит каждый символ в односимвольной строке Unicode.Когда вы звоните getBytes, это дает вам представление этих символов в UTF-8.Для U + 00FE (þ) это c3 be, а для U + 00AE (®) - c2 ae.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...