Почему моя программа неправильно обрабатывает кодировку символов? - PullRequest
0 голосов
/ 09 октября 2019

Я написал то, что, на мой взгляд, было очень простым, очень простым кодом для выделения символов Юникода вместе с соответствующими байтами.

public class UnicodeTesting {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.version"));
        String header = "\u2554\u2550";
        for(byte b : header.getBytes()) {
            System.out.printf("%02X ", b);
        }
        System.out.println();
        System.out.println(header);
    }
}

И когда я запускаю этот код на OnlineGDB.com , я получаю ожидаемый вывод.

1.8.0_201
E2 95 94 E2 95 90 
╔═

Однако, когда я запускаю точно такой же код в моей Eclipse IDE локально, я получаю совсем другой результат:

1.8.0_131
3F 3F 
??

Почему это происходит?


Если я отредактирую код на стороне Eclipse, я смогу по крайней мере получить байтовые значения, чтобы получить то, что я ожидаю, заставив метод getBytes использовать UTF-8 Кодировка:

import java.io.UnsupportedEncodingException;

public class UnicodeTesting2 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println(System.getProperty("java.version"));
        String header = "\u2554\u2550";
        for(byte b : header.getBytes("UTF-8")) {
            System.out.printf("%02X ", b);
        }
        System.out.println();
        System.out.println(header);
    }
}

1.8.0_131
E2 95 94 E2 95 90 
??

(я предполагаю, что моя консоль просто не поддерживает эти символы, поэтому я не беспокоюсь, что они окажутся неправильными)

Но это не объясняет, почему буквальное поведение программы различается в этих двух средах, по умолчанию используется UTF-8 в одной среде, но по умолчанию используется ASCII (я предполагаю) в Eclipse.

1 Ответ

3 голосов
/ 10 октября 2019

Согласно документации Java String:

getBytes()
Кодирует эту строку в последовательность байтов, используя * платформы1011 * кодировка по умолчанию , сохраняющая результат в новом байтовом массиве.

getBytes(string charsetName)
Кодирует эту строку в последовательность байтов, используя заданную кодировку , сохраняя результат в новом байтовом массиве.

В вашей системе кодировка по умолчанию не UTF-8.

...