Java: длина строки при использовании Юникода для отображения квадратных корней? - PullRequest
3 голосов
/ 09 октября 2011

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

Спасибо за любую помощь, я не смог ничего найти по этому вопросу с помощью Google.

1 Ответ

7 голосов
/ 09 октября 2011

обычные методы определения длины строки кажутся неудачными

Они не дают ошибок, длина строки отчета указывается как количество символов Юникода [*]. Если вам нужно другое поведение, вам нужно четко определить, что вы подразумеваете под «длиной строки».

Если вас интересуют длины строк для целей отображения, то обычно вы заинтересованы в подсчете пикселей (или некоторой другой логической / физической единицы), и это ответственность слоя дисплея (для начала у вас могут быть разные ширины для разные символы, если шрифт не моноширинный).

Но если вам просто интересно подсчитать количество графем ( "минимально различимая единица письма в контексте конкретной системы письма" ), вот хороший гид с кодом и примерами. Копируя-обрезая-вставляя соответствующий код оттуда, мы получили бы что-то вроде этого:

  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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...