Java:使用unicode上线显示平方根时的字符串长度?

在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()); 

感谢您的帮助,我在谷歌上找不到任何相关内容。

查找字符串长度的常用方法似乎失败了

它们不会失败,报告字符串长度为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; } 

请记住:以上使用默认locale 。 一个更灵活和更健壮的方法将例如接收显式locale作为参数并调用BreakIterator.getCharacterInstance(locale)

[*]确切地说,正如注释中所指出的, String.length()计算Java字符 ,它们实际上是UTF-16编码中的代码单元。 这相当于仅当我们在BMP内部时才计算Unicode字符。