【问题标题】:Java: length of string when using unicode overline to display square roots?Java:使用 unicode overline 显示平方根时的字符串长度?
【发布时间】:2011-12-04 00:03:00
【问题描述】:

在 Java 中,我创建了一个使用 unicode 和上划线的字符串,因为我试图显示数字的平方根。对于某些格式问题,我需要知道字符串的长度。在 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());

感谢您的帮助,我使用 google 找不到任何关于此的内容。

【问题讨论】:

  • 您的输出将显示在哪里?通过 Swing 在 GUI 上?通过 System.out.println 在终端上?其他地方?
  • 这将使用 Swing 显示在面板中。面板大小将根据字符串的长度而变化。
  • Swing 应该有一些机制来获得要渲染的字符串的预测大小。
  • 谢谢,我已经实现了 fontmetrics 并且正在使用等宽字体,所以有了下面给出的答案,我想我可以进入问题的下一个阶段。感谢您的帮助。

标签: java unicode


【解决方案1】:

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

它们不会失败,将字符串长度报告为 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) 代替

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

【讨论】:

  • 由于他使用的是 Swing,他可能想要像素。
  • 另外,String.length() 返回代码单元的数量,而不是 Unicode 字符,它应该等于代码点,除了 Unicode 非字符。
  • 我一直在网上阅读,看来您为我指明了正确的方向。字形似乎是我想要的。该链接有所帮助。谢谢。
  • @ninjalj :您反对我对 String.length() 的描述是对的,我实际上打算将其作为第一个近似描述(在问题的上下文中它似乎足够了)但我添加了说明。
  • @user986446:不客气。由于您在这里似乎是新人,请务必阅读此stackoverflow.com/faq#howtoask
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多