2011-10-09 62 views
3

在Java中,我创建一个使用unicode和overline的字符串,因为我试图显示数字的平方根。我需要知道一些格式问题的字符串长度。在unicode中使用组合字符时,查找字符串长度的常用方法似乎失败,如以下示例所示。任何人都可以帮助我找到随机数在平方根时第二个字符串的长度,或者提示如何更好地进行平方根显示?Java:使用unicode overline显示平方根时的字符串长度?

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

感谢您的帮助,我无法找到这个使用谷歌任何东西。

+0

您的输出将显示在哪里?在通过Swing的GUI上?在通过System.out.println的终端上?别处? – ninjalj

+0

这将在使用Swing的面板中显示。面板大小将根据字符串的长度而变化。 – cafman

+0

Swing应该有一些机制来获取要呈现的字符串的预测大小。 – ninjalj

回答

7

查找字符串的长度通常的方法似乎忽视

他们没有失败,报告中的字符串lenght Unicode字符数[*]。如果你需要另一种行为,你需要明确地定义“字符串长度”是什么意思。

如果您对显示字符串长度感兴趣,那么通常您会对像素(或某些其他逻辑/物理单位)的计数感兴趣,并且这是显示层的响应能力(首先,您可能有不同的宽度对于不同的字符,如果字体不是等宽的)。

但是,如果你在计数graphemes“在一个特定的书写系统的情况下写的最小单位鲜明”)的数量,here的一个很好的引导与代码和例子只是感兴趣。复制修整,从粘贴有相关的代码,我们希望有这样的事情:

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字符。

+0

由于他使用Swing,他可能需要像素。 – ninjalj

+0

此外,'String.length()'返回代码单元的数量,而不是Unicode字符,它应该等于代码点,保存为Unicode非字符。 – ninjalj

+0

我一直在网上阅读,看起来像你指出我在正确的方向。字素似乎是我想要的。链接帮助。谢谢。 – cafman