Как получить всех национальных символов для выбранной локали? - PullRequest
0 голосов
/ 04 мая 2020

В моем приложении мне нужно сгенерировать пароли на основе всех доступных национальных символов, например:

private String generatePassword(String charSet, int passwordLength) {
    char[] symbols=charSet.toCharArray();
    StringBuilder sbPassword=new StringBuilder();
    Random wheel = new Random();

    for (int i = 0; i < passwordLength; i++) {
       int random = wheel.nextInt(symbols.length);
       sbPassword.append(symbols[random]);
    }
    return sbPassword.toString();
}

Для латиницы у нас есть что-то вроде:

charSet="AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";

Как получить похожие String, содержащий все национальные символы (алфавит), скажем, для тайского, арабского или иврита?

Я имею в виду, все, что мы знаем, что Unicode содержит все национальные символы, доступные для любого Locale, поэтому должен быть способ получить их, иначе мне пришлось бы жестко запрограммировать национальные алфавиты - что некрасиво ... (в моем случае мое приложение поддерживает более 10 языков)

1 Ответ

1 голос
/ 05 мая 2020

Поскольку вы используете char[], вы не сможете представить все кодовые точки Unicode во всех скриптах, поскольку некоторые из них будут находиться за пределами Базовой c Многоязычной плоскости и не поместятся в одиночный char. К сожалению, нет простого способа получить все кодовые точки для скрипта без их перебора, например:

char[] charsForScript(Character.UnicodeScript script) {) {
  StringBuilder sb = new StringBuilder();
  for (int cp = 0; cp < Character.MAX_VALUE; ++cp) {
    if (Character.isValidCodePoint(cp) && script == Character.UnicodeScript.of(cp)) {
      sb.appendCodePoint(cp);
    }
  }
  return sb.toString().toCharArray();
}

Это вернет все символы для данного скрипта, например, LATIN, GREEK и т. Д. c.

Чтобы получить все кодовые точки, даже вне BMP, вы можете использовать:

int[] charsForScript(Character.UnicodeScript script) {) {
  List<Integer> ints = new ArrayList<>();
  for (int cp = 0; cp < Character.MAX_CODE_POINT; ++cp) {
    if (Character.isValidCodePoint(cp) && script == Character.UnicodeScript.of(cp)) {
      ints.add(cp);
    }
  }
  return ints.stream().mapToInt(i -> i).toArray();
}
...