Хобрук: Ваш путь к мастерству в программировании

Проверьте, содержит ли строка Java символ Юникода

Я пытаюсь проверить, содержит ли строка определенную точку юникода из шрифта Segoe MDL2 Assets.

Пример значения Unicode, которое я хочу проверить, это

\uF14B

Вот откуда я беру свои значения

https://docs.microsoft.com/en-us/windows/uwp/design/style/segoe-ui-symbol-font

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

я пытался

        if (buttons[i].getText().contains("\uF14B")) {

            buttons[i].setFont(new Font("Segoe MDL2 Assets", Font.PLAIN, 15 )); 
        }

Хотя это работает, я думаю, что довольно неэффективно копировать и вставлять каждое значение, которое я планирую использовать в операторе if.

Есть ли более простой способ сделать это?

Редактировать:

В итоге я поставил ~ после каждого специального символа в моем массиве и проанализировал его следующим образом. Есть ли проблемы при этом?

/** Creating the names of the buttons. */
String [] buttonNames = {

        "Lsh", "Rsh", "Or", "Xor", "Not","And",
        "\uE752~", "Mod", "CE", "C", "\uF149~", "\uE94A~",
        "A", "B", "\uF14D~", "\uF14E~", "\uE94F~", "\uE947~",
        "C", "D", "\uF14A~", "\uF14B~", "\uF14C~", "\uE949~",
        "E", "F", "\uF14A~", "\uF14B~", "\uF14C~", "\uE948~",
        "(", ")", "\uE94D~", "0", ".", "\uE94E~" 
        };

/** more code here */

if (buttons[i].getText().contains("~")) {

                buttons[i].setFont(new Font("Segoe MDL2 Assets", Font.PLAIN, 15 )); 
                buttons[i].setText(buttons[i].getText().substring(0, buttons[i].getText().lastIndexOf('~')));
            }
11.07.2018

  • Я имею в виду, как именно я могу проверить, содержит ли моя строка значение Unicode. Например, проверка, содержит ли строка \u (хотя я знаю, что на самом деле это не сработает). 11.07.2018
  • вы можете использовать Matchers для этого. 11.07.2018
  • Каждая (непустая) строка содержит символы Юникода. 11.07.2018
  • Возможен дубликат? stackoverflow.com/a/23109928/6785649 11.07.2018
  • Символ серии F1xx на самом деле не является шрифтом или даже символом, поскольку он не имеет назначенного глифа или значения. В основном это частное использование, и любой может использовать его для чего угодно. Я думаю, что некоторые веб-сайты используют одни и те же кодовые точки для случайных графических символов, таких как линии, локти и стрелки, чтобы помочь отрисовать свой пользовательский интерфейс. 11.07.2018
  • Возможно, нашел решение, которое я могу легко понять. 11.07.2018
  • Я поставил ~ после каждого специального символа в своем массиве Какой массив? И если вы поместите ~ символов в текст кнопки, не будут ли кнопки выглядеть странно? 11.07.2018

Ответы:


1

Вы можете инвертировать логику выбора шрифта:

Класс Font имеет такие полезные функции, как canDisplay и canDisplayUpTo. Javadoc:

public int canDisplayUpTo​(String str)

Указывает, может ли этот шрифт отображать указанную строку. Для строк с кодировкой Unicode важно знать, может ли конкретный шрифт отображать строку. Этот метод возвращает смещение в строку str, которая является первым символом, который этот шрифт не может отображать без использования отсутствующего кода глифа. Если шрифт может отображать все символы, возвращается -1.

11.07.2018
  • Потрясающий. Большое спасибо. Я бы не нашел это без вашей помощи. Вы сэкономили мне около 50 строк кода. 11.07.2018

  • 2

    Лучший/самый простой способ сканирования текста для поиска определенных символов — использовать класс символов регулярного выражения.

    Класс символов записывается как [xxx], где xxx может состоять из отдельных символов, например. a или \uF14B и/или диапазоны, например. a-z или \uE700-\uE71F.

    Итак, вы можете написать регулярное выражение следующим образом:

    [\uE700-\uE72E\uE730\uE731\uE734\uE735\uE737-\uE756]
    

    и так далее (это было около 10 % списка кодовых точек в связанная страница).

    Вышеупомянутое также можно сделать с помощью исключения, т.е.

    [\uE700-\uE756&&[^\uE72F\uE732\uE733\uE736]]
    

    где [^xxx] означает «ни один из этих символов».

    Затем вы компилируете его и используете для проверки строк:

    String regex = "[\uE700-\uE72E\uE730\uE731\uE734\uE735\uE737-\uE756]";
    Pattern p = Pattern.compile(regex);
    
    if (p.matcher(buttons[i].getText()).find()) {
    
    11.07.2018
  • Я придумал способ сделать это сам, можете ли вы проверить, что это нормальный способ сделать это? 11.07.2018
  • Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

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