在Java中我创建了一个使用unicode和overline的字符串,因为我试图显示数字的平方根.我需要知道一些格式问题的字符串长度.在unicode中使用组合字符时,查找字符串长度的常用方法似乎失败,如下例所示.任何人都可以帮我找到随机数在平方根中的第二个字符串的长度,或者如何更好地进行平方根显示的提示?
String s = "\u221A"+"12";
String t = "\u221A"+"1"+"\u0305"+"2"+"\u0305";
System.out.println(s);
System.out.println(t);
System.out.println(s.length());
System.out.println(t.length());
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助,我在谷歌上找不到任何相关内容.
查找字符串长度的常用方法似乎失败了
它们不会失败,报告字符串长度为Unicode字符数[*].如果您需要其他行为,则需要明确定义"字符串长度"的含义.
当您对用于显示目的的字符串长度感兴趣时,通常您对计算像素(或其他逻辑/物理单位)感兴趣,并且这是显示层的责任(首先,对于不同的字符,您可能有不同的宽度,如果字体不是等宽的).
但是,如果你在计数的数量只是有兴趣字形("在特定的书写系统的情况下写的最小单位鲜明"),这里是一个很好的引导与代码及实例.复制 - 修剪 - 从那里粘贴相关代码,我们有这样的事情:
public static int getGraphemeCount(String text) {
int graphemeCount = 0;
BreakIterator graphemeCounter = BreakIterator.getCharacterInstance();
graphemeCounter.setText(text);
while (graphemeCounter.next() != BreakIterator.DONE)
graphemeCount++;
return graphemeCount;
}
Run Code Online (Sandbox Code Playgroud)
请记住:以上使用默认值locale.更灵活和强大的方法将,例如,获得一个确实locale的说法,并调用BreakIterator.getCharacterInstance(locale)代替
[*]确切地说,正如评论中所指出的那样,Java字符String.length()计数,它实际上是UTF-16编码中的代码单元.这相当于只有当我们在BMP内部时才计算Unicode字符.