我试图检查字符串是否包含来自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('~')));
}
答案 0 :(得分:3)
您可以反转字体选择逻辑:
Font
类具有诸如canDisplay
和canDisplayUpTo之类的好东西。 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()) {