Как получить строку содержащую национальный алфавит?
В общем есть такой вопрос. Есть некий генератор паролей, который должен быть национально-зависимым, то есть берем текущую локаль (приложение мультиязычное: если интересно поддерживается свыше 10 локалей), выгружаем все возможные символы поддерживаемые в данном языке, задаемся длиной пароля и генерируем из набора символов рандомный пароль. Примерно так:
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";
Как мне получить аналогичную строку скажем для тайского, деванагари или для иврита?
Мы же понимаем, что в Юникод есть все символы, не хотелось бы хардкодить для каждого языка набор алфавита...
Ответы (1 шт):
Я скачал с сайта Unicode CLDR архив cldr-common-37.0.zip. В нём есть различная информация по таблице Unicode, разбитая для языков. В каталоге main можно найти большие xml-файлы с различной информацией. Я распарсил их с помощью python-скрипта
from os import listdir
from os.path import isfile, join
import xml.etree.ElementTree as ET
import csv
mypath = r"path\cldr-common-37.0\common\main"
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
types = ['basic', 'index', 'auxiliary', 'numbers', 'punctuation']
out = open("characters.csv", "w", buffering=1, encoding="utf-8")
writer = csv.writer(out)
writer.writerow(["lang"] + types)
for file in onlyfiles:
print(file)
root = ET.parse(join(mypath, file)).getroot()
for type_tag in root.findall('characters'):
d = {t : "[]" for t in types}
for characters in type_tag.findall('exemplarCharacters'):
t = characters.get('type')
if t is None:
t = 'basic'
d[t] = characters.text
line = [file.split(".")[0]]
for t in types:
line.append(d[t])
writer.writerow(line)
out.close()
В результате получился csv-файл.