Учитывая номер кодовой точки Unicode, как я могу получить объект String или CharSequence для этого символа - PullRequest
0 голосов
/ 22 февраля 2020

Я видел Вопросы и ответы о получении номера кодовой точки символа Unicode в Java. Например, вопрос Как я могу получить код символа Unicode? .

Но я хочу обратного: учитывая целое число, как мне получить текст этого символа, назначенного этому кодовому номеру числу?

Примитивные данные char Тип бесполезен, он ограничен только Основой c Многоязычная плоскость из набора символов Unicode. Эта плоскость представляет приблизительно первые 64 000 символов, определенных в Юникоде. Но Unicode вырос почти вдвое, сейчас определено более 113 000 символов. Количество назначенных символов варьируется более миллиона. Основанный на 16-бит , char ограничен диапазоном 64 КБ, что недостаточно.

Оба Character и String классы предлагают метод codePointAt для проверки символа и возврата int, представляющий кодовую точку, назначенную в Unicode. Я ищу противоположное.

➥ Учитывая int, как получить объект Character, String или некоторую реализацию CharSequence что я могу затем присоединить к другому тексту?

При написании строковых литералов мы можем использовать escape-последовательность Unicode с обратным символом sh -with-u. Но меня интересует работа с целочисленными переменными , мягкое кодирование, а не жесткое кодирование символов Unicode.

1 Ответ

0 голосов
/ 22 февраля 2020

tl; др

String s = Character.toString( 128_567 ) ;

?

Подробности

Вы запросили объект Character, String или некоторая реализация CharSequence.

Character

Класс Character на самом деле legacy , простая обертка объекта вокруг примитивного типа char. Тип char также является устаревшим и определяется внутренне как 16-разрядное число, ограниченное первыми 64 КБ кодовых точек Unicode. Юникод теперь имеет более чем вдвое больше кодовых точек, назначенных символам, поэтому char не может представлять большинство символов.

Таким образом, мы не можем создать экземпляр объекта Character для символа вне набора Basi c Многоязычная . Таким образом, в качестве обходного пути, Character.toString( int ) создает String, содержащий один символ. String может обрабатывать любые символы Юникода, в то время как Character не может.

String ? Character.toString( int )

Чтобы получить объект String, содержащий один символ, определяемый int, передайте int в Character.toString().

В качестве примера мы используем FACE WITH MEDICAL MASK, символ смайлика в U + 1F637 (десятичное число: 128 567).

// -----|  input  |----------------
String input = "?" ;                                 // FACE WITH MEDICAL MASK at code point U+1F637 (decimal: 128,567).
int codePoint = input.codePointAt( 0 ) ;              // Returns 128,567. 
System.out.println( "codePoint : " + codePoint ) ;   

codePoint: 128567

Преобразовать эту int примитивную переменную в String.

// -----|  String  |----------------
String output = Character.toString( codePoint ) ;     // Pass an `int` primitive integer number.
System.out.println( "output : " + output ) ; 

вывод: ?

Или используйте буквенное целое число.

String output2 = Character.toString( 128_567 ) ;      // Pass an integer literal.
System.out.println( "output2 : " + output2 ) ;

output2: ?

См. Этот код, запущенный на IdeOne.com .

CharSequence

Приведенный выше код работает, так как String является реализацией CharSequence.

CharSequence cs = Character.toString( 128_567 ) ;     // Returns a `String` which is a `CharSequence`. 

Я удивлен, что не могу найти способ добавить символ к объекту классов StringBuilder или StringBuffer, которые реализуют CharSequence. Опять же, возможно, я не заметил такой метод.

...