Отображение смайликов с изменением цвета кожи в текстовом поле через юникод - PullRequest
0 голосов
/ 02 апреля 2020

В настоящее время я пытаюсь отобразить смайлики в текстовом представлении через юникод. Я знаю, что изменение \U0001f4ea -> 0x1f4ea, а затем вызов textView.setText(new String(Character.toChars(0x1f4ea))); отображает смайлики в текстовом представлении. Однако большинство современных смайликов, содержащих лица, имеют дополнительный символ юникода сзади, например \U0001f1fa\U0001f1ff для цветового варианта.

Я не уверен, как преобразовать 2 символа юникода в символ.

Есть ли способ, которым я мог бы использовать тот же метод путем преобразования юникода в строку для отображения все цветовые вариации? Должен ли я использовать другой метод? К сожалению, преобразование всех юникодов вручную невозможно.

Спасибо за помощь!

1 Ответ

0 голосов
/ 02 апреля 2020

Я не уверен, как преобразовать 2 символа юникода в символ

Вы не конвертируете два символа в один символ; вы сохраняете их как строку, а механизм компоновки отображает их как один смайлик.

Конструктор String принимает строку в форме кодирования UTF-16, а UTF-16 будет представлять символы вспомогательной плоскости (U +10000 или выше) с использованием суррогатной пары , которая представляет собой последовательность из двух символов. Чтобы создать String для эмодзи с модификатором тона кожи, вам нужно передать последовательность символов UTF-16. Например, для строки, состоящей из последовательности символов Unicode , конструктору требуется массив из 4 символов, которые являются представлением UTF-16 для этой последовательности, [0xD83E, 0xDD1A, 0xD83 C, 0xDFFC].

Вызов Character.toChars () сгенерирует представление UTF-16 для кодовой точки Unicode. Если кодовая точка является символом дополнительной плоскости, toChars () сгенерирует суррогатную пару для этого символа. Но ваш случай требует двух отдельных символов Unicode, которые не могут быть обработаны одним вызовом toChars (). Два отдельных вызова toChars () могут использоваться для двух символов Юникода в последовательности, но вы хотите строку, которая имеет объединенный массив из четырех символов.

Я не владею Java или Android классы, поэтому не могу дать вам самый эффективный способ сделать это. Я уверен, что вы могли бы использовать StringBuilder, создавая с первым символом, а затем добавляя второй. Но может быть и более прямой путь.

...