如何获取所选区域设置的所有国家字符?

How to get all national characters for selected Locale?

在我的应用中,我需要根据所有可用的国家字符生成密码,例如:

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 包含可用于任何区域设置的所有国家字符,因此必须有一种方法来获取它们,否则我将被迫对国家字母表进行硬编码 - 这很丑陋... (在我的例子中,我的应用程序支持超过 10 个语言环境)

由于您使用的是 char[],您将无法在所有脚本中表示所有 Unicode 代码点,因为其中一些将超出基本多语言平面并且不适合单个 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();
}

这将 return 给定脚本的所有字符,例如拉丁文、希腊文等

要获取所有代码点,甚至在 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();
}