Как получить строку содержащую национальный алфавит?

В общем есть такой вопрос. Есть некий генератор паролей, который должен быть национально-зависимым, то есть берем текущую локаль (приложение мультиязычное: если интересно поддерживается свыше 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-файл.

→ Ссылка