检查Java字符串是否包含Unicode字符

时间:2018-07-11 02:05:06

标签: java string unicode

我试图检查字符串是否包含来自Segoe MDL2 Assets字体的特定unicode点。

我要检查的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('~')));
            }

2 个答案:

答案 0 :(得分:3)

您可以反转字体选择逻辑:

Font类具有诸如canDisplaycanDisplayUpTo之类的好东西。 Javadoc:

public int canDisplayUpTo​(String str)
  

指示此字体是否可以显示指定的字符串。对于   Unicode编码的字符串,了解特定的   字体可以显示字符串。此方法将偏移量返回到   字符串str,它是此Font无法显示的第一个字符   而不使用缺少的字形代码。如果字体可以显示全部   个字符,则返回-1。

答案 1 :(得分:2)

扫描文本以查找某些字符的最好/最简单的方法是使用正则表达式字符类。

字符类写为[xxx],其中xxx可以设置单个字符,例如a\uF14B和/或范围,例如a-z\uE700-\uE71F

因此,您可以编写这样的正则表达式:

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

,依此类推,例如(大约占linked page上代码点列表的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()) {