Java: Unicode представления целого числа за пределами 2 байтов диапазона символов

1

Когда я запускаю следующую инструкцию,

    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.

Теги:
unicode

2 ответа

0

Метод 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"), если у вас есть этот шрифт.

0

Класс 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); 
  • 0
    Я знаю, что это дает суррогаты, но вы знаете, как напечатать его юникод-эквивалент? Скажем / предположим, что кодовая точка 5647 представляет å. Когда эта кодовая точка принимает число, скажем, 345678, которое занимает три байта пространства, тогда в операторе печати должно отображаться символ Юникода. Итак, я спрашиваю, как это показать. Вы знаете выход?
  • 0
    @NonymousNT Ой, простите, я неправильно понял, что вы искали. Мое редактирование проясняет вещи?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню