Когда я запускаю следующую инструкцию,
System.out.println("Character is "+(char)65534); //equivalent to 0xfffe
System.out.println("Character is "+(char)65535); //equivalent to 0xffff
System.out.println("Character is "+(char)65536); //equivalent to 0x10000
System.out.println("Character is "+(char)65537); //equivalent to 0x10001
Я получаю вывод как
Character is _ where _ is \ufffe
Character is _ where _ is \uffff
Character is
Character is
После чтения ответов на SO о том, почему этот вывод был получен, это потому, что тип char
имеет 2 байта (что происходит в формате UTF-16 для Java), поэтому вывод в 3-й и 4-й строках пуст из-за выхода за пределы 2 байтов. Итак, я просмотрел класс String
для получения представлений Unicode целых чисел за пределами 2 байта. Его одна функция codePointAt
возвращает целочисленный эквивалент символа в строке. Итак, я искал свою обратную/обратную функцию, но, похоже, такой функции нет.
Может ли кто-нибудь указать мне стандартную функцию на Java, которая выполняет такую функцию. Если этого не существует, то, пожалуйста, расскажите мне, как получить юникодные представления кодовой точки (Java использует высокие и низкие суррогаты для обозначения 3-байтов и более, так что есть две кодовые точки) с нуля.
Редактировать:
Вопрос в основном связан с отображением изображений unicode в заявлении на печать для кодовых точек со значениями больше 0xffff
.
Метод Character.toChars(int)
даст вам коды кода UTF-16, соответствующие этой кодовой точке.
Итак, для вашего примера:
System.out.println("Character is " + new String(Character.toChars(65536))); //equivalent to U+10000
напечатает U + 10000 ("LINEAR B SYLLABLE B008 A"), если у вас есть этот шрифт.
Класс Character
предоставляет следующие методы:
Character.highSurrogate(codePoint);
Character.lowSurrogate(codePoint);
для получения суррогатов, с учетом кодовой точки.
После этого вы можете записать их в ByteBuffer
и получить соответствующий byte[]
и использовать его для создания новой String
с кодировкой UTF-16.
// byte[] bytes = new byte[] { (byte) 0xD8, 0x34, (byte) 0xDD, 0x1E };
String text = "?"; // new String(bytes, StandardCharsets.UTF_16);
int codePoint = text.codePointAt(0);
ByteBuffer buf = ByteBuffer.allocate(4);
buf.putChar(Character.highSurrogate(codePoint));
buf.putChar(Character.lowSurrogate(codePoint));
byte[] data = buf.array();
// recreated
String rep = new String(data, StandardCharsets.UTF_16);