Обнаруживать, поддерживается ли символ Юникода?

Я пытаюсь собрать небольшое приложение для Android, которое может случайно вернуть пользователю эмози. Мое намерение состоит в том, чтобы просто использовать действительные символы unicode emoji и возвращать их как символы строки Юникода.

Я построил полный массив строк unicode, которые могут быть выбраны случайным образом, и многие будут отображаться правильно. Однако некоторые из них отображаются как неподдерживаемые символы (прямоугольник с x через него).

Очевидно, что не каждая платформа будет поддерживать каждый символ юмокода emoji, но, если возможно, мне нужен способ определить, что является и не поддерживается. Идеальным было бы запросить список поддерживаемых символов, но возможность тестирования отдельных символов также отлично справилась бы с работой.

Итак, когда вы говорите о том, что персонаж «неподдерживается», это звучит так, как будто вы имеете в виду, что текущий шрифт не имеет глифа для символа (и либо приложение не имеет резервной логики, чтобы найти другой шрифт, который Или система не имеет никакого шрифта).

В обычной Java это довольно просто: учитывая экземпляр java.awt.Font , вы можете увидеть, имеет ли он глиф для данного символа Unicode, используя метод canDisplay .

API-интерфейсы Android по какой-либо причине, похоже, не раскрывают способ определения того, с каким шрифтом вы работаете. ( android.graphics.Typeface сохраняет эту информацию конфиденциальной: см. «Проверьте семейство объекта Typeface в Android» .) Однако вы можете хотя бы попробовать что-то вроде new java.awt.Font("SansSerif", java.awt.Font.PLAIN, 12) чтобы получить базовый 12-точечный шрифт без засечек. Разумеется, вы захотите проверить, дает ли это полезное приближение для эможи, которое может отобразить реальный шрифт.

Вы можете использовать Character.isDefined чтобы проверить, определен ли символ в версии Unicode на устройстве.

Также проверьте Canvas.hasGlyph(String) , который был добавлен в уровне API 23. Вы можете использовать это, чтобы проверить, имеет ли символ, подобный emoji, доступный глиф.

Вот что говорит документация :

boolean hasGlyph (String string)

Определите, имеет ли шрифт на краске глиф, поддерживающий строку. Самый простой случай – когда строка содержит один символ, в котором этот метод определяет, имеет ли шрифт символ. В случае с несколькими символами метод возвращает true, если есть один символ, представляющий лигатуру. Например, если вход представляет собой пару региональных индикаторных символов, определите, существует ли флаг для пары.

Наконец, если строка содержит селектор вариантов, метод возвращает true только в том случае, если шрифты содержат глиф, специфичный для этого варианта.

Проверка выполняется во всей резервной цепочке, а не только на немедленном упоминании шрифта.

Смотрите также

  • Как определить поддержку emoji на Android по коду