在我的应用中,我需要根据所有可用的国家字符生成密码,例如:
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();
}
这将返回给定脚本(例如,拉丁语,希腊语等)的所有字符”>
要获得所有代码点,即使在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();
}