Get an ISO 15924 script code for a given IETF Lang

2019-03-31 00:07发布

I'm integrating ICU into some in-house software. I'd like to be able to take a string such as "en_US" and get the script name "Latin" for it. (Though ultimately I actually want an ICU ScriptCode.)

I tried using ICU's Locale class, but this code:

Locale *ul = new Locale("en_US",);
LOG(ul->getScript());

Logs an empty string, despite the documentation indicating that this is the use case. I even tried it using the Locale class' static method Locale::getEnglish and still got an empty string. I'm new to this internationalization stuff and to ICU. Is there something I'm missing? Seems like this should be a pretty straightforward task.

Edit: After reading the source code for Locale, it seems that the only time it can provide a script code is when it's passed to the constructor (ie. "en_Latn_US"). Cheers for inadequate documentation. My overall question still stands.

5条回答
等我变得足够好
2楼-- · 2019-03-31 00:51

EDIT: I've made a new and better answer. Use that. I had no luck finding anything, so I decided to do my best to make a table myself. After searching a bit, I found this jem. Clicking (almost) any language will give you the ISO 639-1 code (and more), and clicking any script category will give you the 15924 code. I probably could have written something to tease the tables into c++ manually, but I only needed a couple dozen and couldn't justify automating it (on my jobs dime) so here's the table I made by hand:

std::map<std::string /*ISO 639-1*/, std::string /*ISO 15924*/> table = {
    {"ar", "Arab"}, //Arabic
    {"bn", "Beng"}, //Bengali
    {"zh", "Hani"}, //Chinese
    {"en", "Latn"}, //English
    {"fr", "Latn"}, //French
    {"de", "Latn"}, //German
    {"hi", "Deva"}, //Hindi
    {"it", "Latn"}, //Italian
    {"ja", "Hani"}, //Japanese
    {"jv", "Latn"}, //Javanese
    {"ko", "Hani"}, //Korean
    {"ms", "Latn"}, //Malay/Indonesian
    {"mr", "Deva"}, //Marathi
    {"fa", "Arab"}, //Persian
    {"pt", "Latn"}, //Porteugese
    {"pa", "Arab"}, //Punjabi
    {"ru", "Cyrl"}, //Russian
    {"es", "Latn"}, //Spanish
    {"ta", "Taml"}, //Tamil
    {"te", "Telu"}, //Telugu
    {"tr", "Latn"}, //Turkish
    {"ur", "Arab"}, //Urdu
    {"vi", "Latn"} //Vietnamese
};
查看更多
爱情/是我丢掉的垃圾
3楼-- · 2019-03-31 00:57

Better: http://unicode.org/repos/cldr/trunk/common/supplemental/supplementalData.xml

std::map<std::string /*ISO 639-1*/, std::map<std::string/*ISO ISO3166-1 Alpha 2 or empty*/, std::string /*ISO 15924*/>> table = {
    {"aa", {{"", "Latn"}}}, 
    {"ab", {{"", "Cyrl"}}}, 
    {"abq", {{"", "Cyrl"}}}, 
    {"abr", {{"", ""}}}, 
    {"ace", {{"", "Latn"}}}, 
    {"ach", {{"", "Latn"}}}, 
    {"ada", {{"", "Latn"}}}, 
    {"ady", {{"", "Cyrl"}}}, 
    {"ae", {{"", "Avst"}}}, 
    {"af", {{"", "Latn"}}}, 
    {"agq", {{"", "Latn"}}}, 
    {"aii", {{"", "Cyrl"}}}, 
    {"ain", {{"", "Kana"}}}, 
    {"ak", {{"", "Latn"}}}, 
    {"akk", {{"", "Xsux"}}}, 
    {"ale", {{"", "Latn"}}}, 
    {"alt", {{"", "Cyrl"}}}, 
    {"am", {{"", "Ethi"}}}, 
    {"amo", {{"", "Latn"}}}, 
    {"an", {{"", "Latn"}}}, 
    {"anp", {{"", "Deva"}}}, 
    {"aoz", {{"", ""}}}, 
    {"ar", {{"", "Arab"}, {"IR", "Syrc"}}}, 
    {"arc", {{"", "Armi"}}}, 
    {"arn", {{"", "Latn"}}}, 
    {"arp", {{"", "Latn"}}}, 
    {"arw", {{"", "Latn"}}}, 
    {"as", {{"", "Beng"}}}, 
    {"asa", {{"", "Latn"}}}, 
    {"ast", {{"", "Latn"}}}, 
    {"atj", {{"", ""}}}, 
    {"av", {{"", "Cyrl"}}}, 
    {"awa", {{"", "Deva"}}}, 
    {"ay", {{"", "Latn"}}}, 
    {"az", {{"", "Latn"}, {"AZ", "Cyrl"}, {"IR", "Arab"}}}, 
    {"ba", {{"", "Cyrl"}}}, 
    {"bal", {{"", "Arab"}, {"IR", "Latn"}, {"PK", "Latn"}}}, 
    {"ban", {{"", "Latn"}, {"ID", "Bali"}}}, 
    {"bap", {{"", ""}}}, 
    {"bas", {{"", "Latn"}}}, 
    {"bax", {{"", "Bamu"}}}, 
    {"bbc", {{"", "Latn"}, {"ID", "Batk"}}}, 
    {"bbj", {{"", ""}}}, 
    {"bci", {{"", ""}}}, 
    {"be", {{"", "Cyrl"}}}, 
    {"bej", {{"", "Arab"}}}, 
    {"bem", {{"", "Latn"}}}, 
    {"bew", {{"", ""}}}, 
    {"bez", {{"", "Latn"}}}, 
    {"bfd", {{"", ""}}}, 
    {"bfq", {{"", "Taml"}}}, 
    {"bft", {{"", "Arab"}}}, 
    {"bfy", {{"", "Deva"}}}, 
    {"bg", {{"", "Cyrl"}}}, 
    {"bgc", {{"", ""}}}, 
    {"bgx", {{"", ""}}}, 
    {"bh", {{"", "Deva"}}}, 
    {"bhb", {{"", "Deva"}}}, 
    {"bhi", {{"", ""}}}, 
    {"bhk", {{"", ""}}}, 
    {"bho", {{"", "Deva"}}}, 
    {"bi", {{"", "Latn"}}}, 
    {"bik", {{"", "Latn"}}}, 
    {"bin", {{"", "Latn"}}}, 
    {"bjj", {{"", "Deva"}}}, 
    {"bjn", {{"", ""}}}, 
    {"bkm", {{"", ""}}}, 
    {"bku", {{"", "Latn"}}}, 
    {"bla", {{"", "Latn"}}}, 
    {"blt", {{"", "Tavt"}}}, 
    {"bm", {{"", "Latn"}}}, 
    {"bmq", {{"", ""}}}, 
    {"bn", {{"", "Beng"}}}, 
    {"bo", {{"", "Tibt"}}}, 
    {"bqi", {{"", ""}}}, 
    {"bqv", {{"", "Latn"}}}, 
    {"br", {{"", "Latn"}}}, 
    {"bra", {{"", "Deva"}}}, 
    {"brh", {{"", ""}}}, 
    {"brx", {{"", "Deva"}}}, 
    {"bs", {{"", "Latn"}}}, 
    {"bss", {{"", ""}}}, 
    {"bto", {{"", ""}}}, 
    {"btv", {{"", "Deva"}}}, 
    {"bua", {{"", "Cyrl"}}}, 
    {"buc", {{"", "Latn"}}}, 
    {"bug", {{"", "Latn"}, {"ID", "Bugi"}}}, 
    {"bum", {{"", ""}}}, 
    {"bvb", {{"", ""}}}, 
    {"bya", {{"", "Latn"}}}, 
    {"byn", {{"", "Ethi"}}}, 
    {"byv", {{"", ""}}}, 
    {"bze", {{"", ""}}}, 
    {"bzx", {{"", ""}}}, 
    {"ca", {{"", "Latn"}}}, 
    {"cad", {{"", "Latn"}}}, 
    {"car", {{"", "Latn"}}}, 
    {"cay", {{"", "Latn"}}}, 
    {"cch", {{"", "Latn"}}}, 
    {"ccp", {{"", "Beng"}}}, 
    {"ce", {{"", "Cyrl"}}}, 
    {"ceb", {{"", "Latn"}}}, 
    {"cgg", {{"", "Latn"}}}, 
    {"ch", {{"", "Latn"}}}, 
    {"chk", {{"", "Latn"}}}, 
    {"chm", {{"", "Cyrl"}}}, 
    {"chn", {{"", "Latn"}}}, 
    {"cho", {{"", "Latn"}}}, 
    {"chp", {{"", "Latn"}}}, 
    {"chr", {{"", "Cher"}}}, 
    {"chy", {{"", "Latn"}}}, 
    {"cja", {{"", "Arab"}}}, 
    {"cjm", {{"", "Cham"}}}, 
    {"cjs", {{"", "Cyrl"}}}, 
    {"ckb", {{"", "Arab"}}}, 
    {"ckt", {{"", "Cyrl"}}}, 
    {"co", {{"", "Latn"}}}, 
    {"cop", {{"", "Arab"}}}, 
    {"cpe", {{"", "Latn"}}}, 
    {"cr", {{"", "Cans"}}}, 
    {"crh", {{"", "Cyrl"}}}, 
    {"crj", {{"", ""}}}, 
    {"crk", {{"", "Cans"}}}, 
    {"crl", {{"", ""}}}, 
    {"crm", {{"", ""}}}, 
    {"crs", {{"", ""}}}, 
    {"cs", {{"", "Latn"}}}, 
    {"csb", {{"", "Latn"}}}, 
    {"csw", {{"", ""}}}, 
    {"cu", {{"", "Glag"}}}, 
    {"cv", {{"", "Cyrl"}}}, 
    {"cy", {{"", "Latn"}}}, 
    {"da", {{"", "Latn"}}}, 
    {"daf", {{"", ""}}}, 
    {"dak", {{"", "Latn"}}}, 
    {"dar", {{"", "Cyrl"}}}, 
    {"dav", {{"", "Latn"}}}, 
    {"dcc", {{"", ""}}}, 
    {"de", {{"", "Latn"}, {"BR", "Runr"}, {"KZ", "Runr"}, {"US", "Runr"}}}, 
    {"del", {{"", "Latn"}}}, 
    {"den", {{"", "Latn"}}}, 
    {"dgr", {{"", "Latn"}}}, 
    {"din", {{"", "Latn"}}}, 
    {"dje", {{"", "Latn"}}}, 
    {"dng", {{"", "Cyrl"}}}, 
    {"doi", {{"", "Arab"}}}, 
    {"dsb", {{"", "Latn"}}}, 
    {"dtm", {{"", ""}}}, 
    {"dua", {{"", "Latn"}}}, 
    {"dv", {{"", "Thaa"}}}, 
    {"dyo", {{"", "Arab"}}}, 
    {"dyu", {{"", "Latn"}}}, 
    {"dz", {{"", "Tibt"}}}, 
    {"ebu", {{"", "Latn"}}}, 
    {"ee", {{"", "Latn"}}}, 
    {"efi", {{"", "Latn"}}}, 
    {"egy", {{"", "Egyp"}}}, 
    {"eka", {{"", "Latn"}}}, 
    {"eky", {{"", "Kali"}}}, 
    {"el", {{"", "Grek"}}}, 
    {"en", {{"", "Latn"}}}, 
    {"eo", {{"", "Latn"}}}, 
    {"es", {{"", "Latn"}}}, 
    {"et", {{"", "Latn"}}}, 
    {"ett", {{"", "Ital"}}}, 
    {"eu", {{"", "Latn"}}}, 
    {"evn", {{"", "Cyrl"}}}, 
    {"ewo", {{"", "Latn"}}}, 
    {"fa", {{"", "Arab"}}}, 
    {"fan", {{"", "Latn"}}}, 
    {"ff", {{"", "Latn"}}}, 
    {"ffm", {{"", ""}}}, 
    {"fi", {{"", "Latn"}}}, 
    {"fil", {{"", "Latn"}, {"US", "Tglg"}}}, 
    {"fiu", {{"", "Latn"}}}, 
    {"fj", {{"", "Latn"}}}, 
    {"fo", {{"", "Latn"}}}, 
    {"fon", {{"", "Latn"}}}, 
    {"fr", {{"", "Latn"}}}, 
    {"frr", {{"", "Latn"}}}, 
    {"frs", {{"", "Latn"}}}, 
    {"fud", {{"", ""}}}, 
    {"fuq", {{"", ""}}}, 
    {"fur", {{"", "Latn"}}}, 
    {"fuv", {{"", ""}}}, 
    {"fy", {{"", "Latn"}}}, 
    {"ga", {{"", "Latn"}}}, 
    {"gaa", {{"", "Latn"}}}, 
    {"gag", {{"", "Latn"}, {"MD", "Cyrl"}}}, 
    {"gay", {{"", "Latn"}}}, 
    {"gba", {{"", "Arab"}}}, 
    {"gbm", {{"", "Deva"}}}, 
    {"gcr", {{"", "Latn"}}}, 
    {"gd", {{"", "Latn"}}}, 
    {"gez", {{"", "Ethi"}}}, 
    {"ggn", {{"", ""}}}, 
    {"gil", {{"", "Latn"}}}, 
    {"gjk", {{"", ""}}}, 
    {"gju", {{"", ""}}}, 
    {"gl", {{"", "Latn"}}}, 
    {"gld", {{"", "Cyrl"}}}, 
    {"glk", {{"", ""}}}, 
    {"gn", {{"", "Latn"}}}, 
    {"gon", {{"", "Telu"}}}, 
    {"gor", {{"", "Latn"}}}, 
    {"gos", {{"", ""}}}, 
    {"got", {{"", "Goth"}}}, 
    {"grb", {{"", "Latn"}}}, 
    {"grc", {{"", "Cprt"}}}, 
    {"grt", {{"", "Beng"}}}, 
    {"gsw", {{"", "Latn"}}}, 
    {"gu", {{"", "Gujr"}}}, 
    {"gub", {{"", ""}}}, 
    {"guz", {{"", "Latn"}}}, 
    {"gv", {{"", "Latn"}}}, 
    {"gvr", {{"", ""}}}, 
    {"gwi", {{"", "Latn"}}}, 
    {"ha", {{"", "Arab"}, {"NE", "Latn"}, {"GH", "Latn"}}}, 
    {"hai", {{"", "Latn"}}}, 
    {"haw", {{"", "Latn"}}}, 
    {"haz", {{"", ""}}}, 
    {"he", {{"", "Hebr"}}}, 
    {"hi", {{"", "Deva"}}}, 
    {"hil", {{"", "Latn"}}}, 
    {"hit", {{"", "Xsux"}}}, 
    {"hmn", {{"", "Latn"}}}, 
    {"hnd", {{"", ""}}}, 
    {"hne", {{"", "Deva"}}}, 
    {"hnn", {{"", "Latn"}}}, 
    {"hno", {{"", ""}}}, 
    {"ho", {{"", "Latn"}}}, 
    {"hoc", {{"", "Deva"}}}, 
    {"hoj", {{"", "Deva"}}}, 
    {"hop", {{"", "Latn"}}}, 
    {"hr", {{"", "Latn"}}}, 
    {"hsb", {{"", "Latn"}}}, 
    {"ht", {{"", "Latn"}}}, 
    {"hu", {{"", "Latn"}}}, 
    {"hup", {{"", "Latn"}}}, 
    {"hy", {{"", "Armn"}}}, 
    {"hz", {{"", "Latn"}}}, 
    {"ia", {{"", "Latn"}}}, 
    {"iba", {{"", "Latn"}}}, 
    {"ibb", {{"", "Latn"}}}, 
    {"id", {{"", "Latn"}}}, 
    {"ig", {{"", "Latn"}}}, 
    {"ii", {{"", "Yiii"}, {"CN", "Latn"}}}, 
    {"ik", {{"", "Latn"}}}, 
    {"ikt", {{"", ""}}}, 
    {"ilo", {{"", "Latn"}}}, 
    {"inh", {{"", "Cyrl"}}}, 
    {"is", {{"", "Latn"}}}, 
    {"it", {{"", "Latn"}}}, 
    {"iu", {{"", "Cans"}, {"CA", "Latn"}}}, 
    {"ja", {{"", "Jpan"}}}, 
    {"jmc", {{"", "Latn"}}}, 
    {"jml", {{"", ""}}}, 
    {"jpr", {{"", "Hebr"}}}, 
    {"jrb", {{"", "Hebr"}}}, 
    {"jv", {{"", "Latn"}, {"ID", "Java"}}}, 
    {"ka", {{"", "Geor"}}}, 
    {"kaa", {{"", "Cyrl"}}}, 
    {"kab", {{"", "Latn"}}}, 
    {"kac", {{"", "Latn"}}}, 
    {"kaj", {{"", "Latn"}}}, 
    {"kam", {{"", "Latn"}}}, 
    {"kao", {{"", ""}}}, 
    {"kbd", {{"", "Cyrl"}}}, 
    {"kca", {{"", "Cyrl"}}}, 
    {"kcg", {{"", "Latn"}}}, 
    {"kck", {{"", ""}}}, 
    {"kde", {{"", "Latn"}}}, 
    {"kdt", {{"", "Thai"}}}, 
    {"kea", {{"", "Latn"}}}, 
    {"kfo", {{"", "Latn"}}}, 
    {"kfr", {{"", "Deva"}}}, 
    {"kfy", {{"", ""}}}, 
    {"kg", {{"", "Latn"}}}, 
    {"kge", {{"", ""}}}, 
    {"kgp", {{"", ""}}}, 
    {"kha", {{"", "Latn"}, {"IN", "Beng"}}}, 
    {"khb", {{"", "Talu"}}}, 
    {"khn", {{"", ""}}}, 
    {"khq", {{"", "Latn"}}}, 
    {"kht", {{"", "Mymr"}}}, 
    {"khw", {{"", ""}}}, 
    {"ki", {{"", "Latn"}}}, 
    {"kj", {{"", "Latn"}}}, 
    {"kjg", {{"", ""}}}, 
    {"kjh", {{"", "Cyrl"}}}, 
    {"kk", {{"", "Arab"}, {"KZ", "Cyrl"}, {"TR", "Cyrl"}}}, 
    {"kkj", {{"", ""}}}, 
    {"kl", {{"", "Latn"}}}, 
    {"kln", {{"", "Latn"}}}, 
    {"km", {{"", "Khmr"}}}, 
    {"kmb", {{"", "Latn"}}}, 
    {"kn", {{"", "Knda"}}}, 
    {"ko", {{"", "Kore"}}}, 
    {"koi", {{"", "Cyrl"}}}, 
    {"kok", {{"", "Deva"}}}, 
    {"kos", {{"", "Latn"}}}, 
    {"kpe", {{"", "Latn"}}}, 
    {"kpy", {{"", "Cyrl"}}}, 
    {"kr", {{"", "Latn"}}}, 
    {"krc", {{"", "Cyrl"}}}, 
    {"kri", {{"", "Latn"}}}, 
    {"krl", {{"", "Latn"}}}, 
    {"kru", {{"", "Deva"}}}, 
    {"ks", {{"", "Arab"}}}, 
    {"ksb", {{"", "Latn"}}}, 
    {"ksf", {{"", "Latn"}}}, 
    {"ksh", {{"", "Latn"}}}, 
    {"ku", {{"", "Latn"}, {"LB", "Arab"}}}, 
    {"kum", {{"", "Cyrl"}}}, 
    {"kut", {{"", "Latn"}}}, 
    {"kv", {{"", "Cyrl"}}}, 
    {"kvr", {{"", ""}}}, 
    {"kvx", {{"", ""}}}, 
    {"kw", {{"", "Latn"}}}, 
    {"kxm", {{"", ""}}}, 
    {"kxp", {{"", ""}}}, 
    {"ky", {{"", "Cyrl"}, {"CN", "Arab"}, {"TR", "Latn"}}}, 
    {"kyu", {{"", "Kali"}}}, 
    {"la", {{"", "Latn"}}}, 
    {"lad", {{"", "Hebr"}}}, 
    {"lag", {{"", "Latn"}}}, 
    {"lah", {{"", "Arab"}}}, 
    {"laj", {{"", ""}}}, 
    {"lam", {{"", "Latn"}}}, 
    {"lb", {{"", "Latn"}}}, 
    {"lbe", {{"", "Cyrl"}}}, 
    {"lbw", {{"", ""}}}, 
    {"lcp", {{"", "Thai"}}}, 
    {"lep", {{"", "Lepc"}}}, 
    {"lez", {{"", "Cyrl"}}}, 
    {"lg", {{"", "Latn"}}}, 
    {"li", {{"", "Latn"}}}, 
    {"lif", {{"", "Deva"}}}, 
    {"lis", {{"", "Lisu"}}}, 
    {"ljp", {{"", ""}}}, 
    {"lki", {{"", "Arab"}}}, 
    {"lkt", {{"", ""}}}, 
    {"lmn", {{"", "Telu"}}}, 
    {"lmo", {{"", ""}}}, 
    {"ln", {{"", "Latn"}}}, 
    {"lo", {{"", "Laoo"}}}, 
    {"lol", {{"", "Latn"}}}, 
    {"loz", {{"", "Latn"}}}, 
    {"lrc", {{"", ""}}}, 
    {"lt", {{"", "Latn"}}}, 
    {"lu", {{"", "Latn"}}}, 
    {"lua", {{"", "Latn"}}}, 
    {"lui", {{"", "Latn"}}}, 
    {"lun", {{"", "Latn"}}}, 
    {"luo", {{"", "Latn"}}}, 
    {"lus", {{"", "Beng"}}}, 
    {"lut", {{"", "Latn"}}}, 
    {"luy", {{"", "Latn"}}}, 
    {"luz", {{"", ""}}}, 
    {"lv", {{"", "Latn"}}}, 
    {"lwl", {{"", "Thai"}}}, 
    {"mad", {{"", "Latn"}}}, 
    {"maf", {{"", ""}}}, 
    {"mag", {{"", "Deva"}}}, 
    {"mai", {{"", "Deva"}}}, 
    {"mak", {{"", "Latn"}, {"ID", "Bugi"}}}, 
    {"man", {{"", "Latn"}, {"GN", "Nkoo"}}}, 
    {"mas", {{"", "Latn"}}}, 
    {"maz", {{"", ""}}}, 
    {"mdf", {{"", "Cyrl"}}}, 
    {"mdh", {{"", "Latn"}}}, 
    {"mdr", {{"", "Latn"}}}, 
    {"mdt", {{"", ""}}}, 
    {"men", {{"", "Latn"}}}, 
    {"mer", {{"", "Latn"}}}, 
    {"mfa", {{"", ""}}}, 
    {"mfe", {{"", "Latn"}}}, 
    {"mg", {{"", "Latn"}}}, 
    {"mgh", {{"", "Latn"}}}, 
    {"mgp", {{"", ""}}}, 
    {"mgy", {{"", ""}}}, 
    {"mh", {{"", "Latn"}}}, 
    {"mi", {{"", "Latn"}}}, 
    {"mic", {{"", "Latn"}}}, 
    {"min", {{"", "Latn"}}}, 
    {"mk", {{"", "Cyrl"}}}, 
    {"ml", {{"", "Mlym"}}}, 
    {"mn", {{"", "Cyrl"}, {"CN", "Mong"}}}, 
    {"mnc", {{"", "Mong"}}}, 
    {"mni", {{"", "Beng"}, {"IN", "Mtei"}}}, 
    {"mns", {{"", "Cyrl"}}}, 
    {"mnw", {{"", "Mymr"}}}, 
    {"moe", {{"", ""}}}, 
    {"moh", {{"", "Latn"}}}, 
    {"mos", {{"", "Latn"}}}, 
    {"mr", {{"", "Deva"}}}, 
    {"mrd", {{"", ""}}}, 
    {"mrj", {{"", ""}}}, 
    {"ms", {{"", "Arab"}, {"MY", "Latn"}, {"SG", "Latn"}}}, 
    {"mt", {{"", "Latn"}}}, 
    {"mtr", {{"", ""}}}, 
    {"mua", {{"", "Latn"}}}, 
    {"mus", {{"", "Latn"}}}, 
    {"mvy", {{"", ""}}}, 
    {"mwk", {{"", ""}}}, 
    {"mwl", {{"", "Latn"}}}, 
    {"mwr", {{"", "Deva"}}}, 
    {"mxc", {{"", ""}}}, 
    {"my", {{"", "Mymr"}}}, 
    {"myv", {{"", "Cyrl"}}}, 
    {"myx", {{"", ""}}}, 
    {"myz", {{"", "Mand"}}}, 
    {"na", {{"", "Latn"}}}, 
    {"nap", {{"", "Latn"}}}, 
    {"naq", {{"", "Latn"}}}, 
    {"nb", {{"", "Latn"}}}, 
    {"nbf", {{"", ""}}}, 
    {"nch", {{"", ""}}}, 
    {"nd", {{"", "Latn"}}}, 
    {"ndc", {{"", ""}}}, 
    {"nds", {{"", "Latn"}}}, 
    {"ne", {{"", "Deva"}}}, 
    {"new", {{"", "Deva"}}}, 
    {"ng", {{"", "Latn"}}}, 
    {"ngl", {{"", ""}}}, 
    {"nhe", {{"", ""}}}, 
    {"nhw", {{"", ""}}}, 
    {"nia", {{"", "Latn"}}}, 
    {"nij", {{"", ""}}}, 
    {"niu", {{"", "Latn"}}}, 
    {"nl", {{"", "Latn"}}}, 
    {"nmg", {{"", "Latn"}}}, 
    {"nn", {{"", "Latn"}}}, 
    {"nnh", {{"", ""}}}, 
    {"nod", {{"", "Lana"}}}, 
    {"noe", {{"", ""}}}, 
    {"nog", {{"", "Cyrl"}}}, 
    {"nqo", {{"", "Nkoo"}}}, 
    {"nr", {{"", "Latn"}}}, 
    {"nsk", {{"", ""}}}, 
    {"nso", {{"", "Latn"}}}, 
    {"nus", {{"", "Latn"}}}, 
    {"nv", {{"", "Latn"}}}, 
    {"ny", {{"", "Latn"}}}, 
    {"nym", {{"", "Latn"}}}, 
    {"nyn", {{"", "Latn"}}}, 
    {"nyo", {{"", "Latn"}}}, 
    {"nzi", {{"", "Latn"}}}, 
    {"oc", {{"", "Latn"}}}, 
    {"oj", {{"", "Cans"}}}, 
    {"om", {{"", "Latn"}, {"ET", "Ethi"}}}, 
    {"or", {{"", "Orya"}}}, 
    {"os", {{"", "Cyrl"}}}, 
    {"osa", {{"", "Latn"}}}, 
    {"osc", {{"", "Ital"}}}, 
    {"otk", {{"", "Orkh"}}}, 
    {"pa", {{"", "Guru"}, {"PK", "Arab"}}}, 
    {"pag", {{"", "Latn"}}}, 
    {"pal", {{"", "Phli"}}}, 
    {"pam", {{"", "Latn"}}}, 
    {"pap", {{"", "Latn"}}}, 
    {"pau", {{"", "Latn"}}}, 
    {"peo", {{"", "Xpeo"}}}, 
    {"phn", {{"", "Phnx"}}}, 
    {"pi", {{"", "Deva"}}}, 
    {"pko", {{"", ""}}}, 
    {"pl", {{"", "Latn"}}}, 
    {"pon", {{"", "Latn"}}}, 
    {"pra", {{"", "Brah"}}}, 
    {"prd", {{"", "Arab"}}}, 
    {"prg", {{"", "Latn"}}}, 
    {"prs", {{"", "Arab"}}}, 
    {"ps", {{"", "Arab"}}}, 
    {"pt", {{"", "Latn"}}}, 
    {"puu", {{"", ""}}}, 
    {"qu", {{"", "Latn"}}}, 
    {"raj", {{"", "Latn"}}}, 
    {"rap", {{"", "Latn"}}}, 
    {"rar", {{"", "Latn"}}}, 
    {"rcf", {{"", "Latn"}}}, 
    {"rej", {{"", "Latn"}, {"ID", "Rjng"}}}, 
    {"ria", {{"", ""}}}, 
    {"rif", {{"", ""}}}, 
    {"rjs", {{"", "Deva"}}}, 
    {"rkt", {{"", "Beng"}}}, 
    {"rm", {{"", "Latn"}}}, 
    {"rmf", {{"", ""}}}, 
    {"rmo", {{"", ""}}}, 
    {"rmt", {{"", ""}}}, 
    {"rn", {{"", "Latn"}}}, 
    {"rng", {{"", ""}}}, 
    {"ro", {{"", "Latn"}, {"RS", "Cyrl"}}}, 
    {"rob", {{"", ""}}}, 
    {"rof", {{"", "Latn"}}}, 
    {"rom", {{"", "Cyrl"}}}, 
    {"ru", {{"", "Cyrl"}}}, 
    {"rue", {{"", ""}}}, 
    {"rup", {{"", "Latn"}}}, 
    {"rw", {{"", "Latn"}}}, 
    {"rwk", {{"", "Latn"}}}, 
    {"ryu", {{"", ""}}}, 
    {"sa", {{"", "Deva"}}}, 
    {"sad", {{"", "Latn"}}}, 
    {"saf", {{"", "Latn"}}}, 
    {"sah", {{"", "Cyrl"}}}, 
    {"sam", {{"", "Hebr"}}}, 
    {"saq", {{"", "Latn"}}}, 
    {"sas", {{"", "Latn"}}}, 
    {"sat", {{"", "Latn"}}}, 
    {"saz", {{"", "Saur"}}}, 
    {"sbp", {{"", "Latn"}}}, 
    {"sc", {{"", "Latn"}}}, 
    {"sck", {{"", ""}}}, 
    {"scn", {{"", "Latn"}}}, 
    {"sco", {{"", "Latn"}}}, 
    {"scs", {{"", ""}}}, 
    {"sd", {{"", "Arab"}, {"IN", "Deva"}}}, 
    {"sdh", {{"", "Arab"}}}, 
    {"se", {{"", "Latn"}, {"NO", "Cyrl"}}}, 
    {"see", {{"", "Latn"}}}, 
    {"sef", {{"", ""}}}, 
    {"seh", {{"", "Latn"}}}, 
    {"sel", {{"", "Cyrl"}}}, 
    {"ses", {{"", "Latn"}}}, 
    {"sg", {{"", "Latn"}}}, 
    {"sga", {{"", "Latn"}}}, 
    {"shi", {{"", "Tfng"}}}, 
    {"shn", {{"", "Mymr"}}}, 
    {"si", {{"", "Sinh"}}}, 
    {"sid", {{"", "Latn"}}}, 
    {"sk", {{"", "Latn"}}}, 
    {"skr", {{"", ""}}}, 
    {"sl", {{"", "Latn"}}}, 
    {"sm", {{"", "Latn"}}}, 
    {"sma", {{"", "Latn"}}}, 
    {"smi", {{"", "Latn"}}}, 
    {"smj", {{"", "Latn"}}}, 
    {"smn", {{"", "Latn"}}}, 
    {"sms", {{"", "Latn"}}}, 
    {"sn", {{"", "Latn"}}}, 
    {"snk", {{"", "Latn"}}}, 
    {"so", {{"", "Latn"}}}, 
    {"son", {{"", "Latn"}}}, 
    {"sou", {{"", ""}}}, 
    {"sq", {{"", "Latn"}}}, 
    {"sr", {{"", "Latn"}}}, 
    {"srn", {{"", "Latn"}}}, 
    {"srr", {{"", "Latn"}}}, 
    {"srx", {{"", ""}}}, 
    {"ss", {{"", "Latn"}}}, 
    {"ssy", {{"", "Latn"}}}, 
    {"st", {{"", "Latn"}}}, 
    {"su", {{"", "Latn"}}}, 
    {"suk", {{"", "Latn"}}}, 
    {"sus", {{"", "Latn"}, {"GN", "Arab"}}}, 
    {"sv", {{"", "Latn"}}}, 
    {"sw", {{"", "Latn"}}}, 
    {"swb", {{"", "Arab"}, {"YT", "Latn"}}}, 
    {"swc", {{"", "Latn"}}}, 
    {"swv", {{"", ""}}}, 
    {"sxn", {{"", ""}}}, 
    {"syi", {{"", ""}}}, 
    {"syl", {{"", "Beng"}, {"BD", "Sylo"}}}, 
    {"syr", {{"", "Syrc"}}}, 
    {"ta", {{"", "Taml"}}}, 
    {"tab", {{"", "Cyrl"}}}, 
    {"taj", {{"", ""}}}, 
    {"tbw", {{"", "Latn"}}}, 
    {"tcy", {{"", "Knda"}}}, 
    {"tdd", {{"", "Tale"}}}, 
    {"tdg", {{"", ""}}}, 
    {"tdh", {{"", ""}}}, 
    {"te", {{"", "Telu"}}}, 
    {"tem", {{"", "Latn"}}}, 
    {"teo", {{"", "Latn"}}}, 
    {"ter", {{"", "Latn"}}}, 
    {"tet", {{"", "Latn"}}}, 
    {"tg", {{"", "Cyrl"}, {"PK", "Arab"}}}, 
    {"th", {{"", "Thai"}}}, 
    {"thl", {{"", ""}}}, 
    {"thq", {{"", ""}}}, 
    {"thr", {{"", ""}}}, 
    {"ti", {{"", "Ethi"}}}, 
    {"tig", {{"", "Ethi"}}}, 
    {"tiv", {{"", "Latn"}}}, 
    {"tk", {{"", "Latn"}}}, 
    {"tkl", {{"", "Latn"}}}, 
    {"tkt", {{"", ""}}}, 
    {"tli", {{"", "Latn"}}}, 
    {"tmh", {{"", "Latn"}}}, 
    {"tn", {{"", "Latn"}}}, 
    {"to", {{"", "Latn"}}}, 
    {"tog", {{"", "Latn"}}}, 
    {"tpi", {{"", "Latn"}}}, 
    {"tr", {{"", "Latn"}, {"DE", "Arab"}, {"MK", "Arab"}}}, 
    {"tru", {{"", "Latn"}}}, 
    {"trv", {{"", "Latn"}}}, 
    {"ts", {{"", "Latn"}}}, 
    {"tsf", {{"", ""}}}, 
    {"tsg", {{"", "Latn"}}}, 
    {"tsi", {{"", "Latn"}}}, 
    {"tsj", {{"", ""}}}, 
    {"tt", {{"", "Cyrl"}}}, 
    {"ttj", {{"", ""}}}, 
    {"tts", {{"", "Thai"}}}, 
    {"tum", {{"", "Latn"}}}, 
    {"tut", {{"", "Cyrl"}}}, 
    {"tvl", {{"", "Latn"}}}, 
    {"twq", {{"", "Latn"}}}, 
    {"ty", {{"", "Latn"}}}, 
    {"tyv", {{"", "Cyrl"}}}, 
    {"tzm", {{"", "Latn"}}}, 
    {"ude", {{"", "Cyrl"}}}, 
    {"udm", {{"", "Cyrl"}, {"RU", "Latn"}}}, 
    {"ug", {{"", "Arab"}, {"KZ", "Cyrl"}, {"MN", "Cyrl"}}}, 
    {"uga", {{"", "Ugar"}}}, 
    {"uk", {{"", "Cyrl"}}}, 
    {"uli", {{"", "Latn"}}}, 
    {"umb", {{"", "Latn"}}}, 
    {"und", {{"", ""}}}, 
    {"unr", {{"", "Beng"}, {"NP", "Deva"}}}, 
    {"unx", {{"", "Beng"}}}, 
    {"ur", {{"", "Arab"}}}, 
    {"uz", {{"", "Latn"}, {"AF", "Arab"}, {"CN", "Cyrl"}}}, 
    {"vai", {{"", "Vaii"}}}, 
    {"ve", {{"", "Latn"}}}, 
    {"vi", {{"", "Latn"}, {"US", "Hani"}}}, 
    {"vic", {{"", ""}}}, 
    {"vmw", {{"", ""}}}, 
    {"vo", {{"", "Latn"}}}, 
    {"vot", {{"", "Latn"}}}, 
    {"vun", {{"", "Latn"}}}, 
    {"wa", {{"", "Latn"}}}, 
    {"wae", {{"", "Latn"}}}, 
    {"wak", {{"", "Latn"}}}, 
    {"wal", {{"", "Ethi"}}}, 
    {"war", {{"", "Latn"}}}, 
    {"was", {{"", "Latn"}}}, 
    {"wbq", {{"", ""}}}, 
    {"wbr", {{"", ""}}}, 
    {"wls", {{"", ""}}}, 
    {"wo", {{"", "Latn"}}}, 
    {"wtm", {{"", ""}}}, 
    {"xal", {{"", "Cyrl"}}}, 
    {"xav", {{"", ""}}}, 
    {"xcr", {{"", "Cari"}}}, 
    {"xh", {{"", "Latn"}}}, 
    {"xnr", {{"", ""}}}, 
    {"xog", {{"", "Latn"}}}, 
    {"xpr", {{"", "Prti"}}}, 
    {"xsa", {{"", "Sarb"}}}, 
    {"xsr", {{"", "Deva"}}}, 
    {"xum", {{"", "Ital"}}}, 
    {"yao", {{"", "Latn"}}}, 
    {"yap", {{"", "Latn"}}}, 
    {"yav", {{"", "Latn"}}}, 
    {"ybb", {{"", ""}}}, 
    {"yi", {{"", "Hebr"}}}, 
    {"yo", {{"", "Latn"}}}, 
    {"yrk", {{"", "Cyrl"}}}, 
    {"yua", {{"", ""}}}, 
    {"yue", {{"", "Hans"}}}, 
    {"za", {{"", "Latn"}, {"CN", "Hans"}}}, 
    {"zap", {{"", "Latn"}}}, 
    {"zdj", {{"", ""}}}, 
    {"zea", {{"", ""}}}, 
    {"zen", {{"", "Tfng"}}}, 
    {"zh", {{"", "Hant"}, {"CN", "Hans"}, {"HK", "Hans"}, {"MO", "Hans"}, {"SG", "Hans"}, {"MN", "Hans"}}}, 
    {"zmi", {{"", ""}}}, 
    {"zu", {{"", "Latn"}}}, 
    {"zun", {{"", "Latn"}}}, 
    {"zza", {{"", "Arab"}}}
};

C#, usings excluded for character count:

namespace territoryInfoScraper
{
    class MainClass
    {
        static string LanguageEntryToString(KeyValuePair<string, Dictionary<string, List<string>>> entry, Dictionary<string, List<string>> languagePrimaryScripts) {
            var language = entry.Key;
            var scriptsByTerritory = entry.Value;
            var result = new StringBuilder ();
            result.Append ("{\"");
            result.Append (language);
            result.Append ("\", {{\"\", \"");
            string defaultScript;
            if (languagePrimaryScripts.ContainsKey (language) && languagePrimaryScripts [language].Count == 1) {
                defaultScript = languagePrimaryScripts [language] [0];
            } else {
                IEnumerable<string> listOfScripts = scriptsByTerritory.SelectMany (x => x.Value);
                var groupsWithCounts = from s in listOfScripts group s by s into g select new {Item = g.Key, Count = g.Count()};
                var groupsSorted = groupsWithCounts.OrderByDescending (g => g.Count);
                if (groupsSorted.Count () > 0) {
                    defaultScript = groupsSorted.First ().Item;
                } else {
                    System.Diagnostics.Debug.WriteLine ("Could not determine a default script");
                    defaultScript = "";
                }
            }
            result.Append (defaultScript);
            result.Append ("\"}");
            var specifiedTerritories = scriptsByTerritory.Where (x => x.Key != "" && x.Value.Count == 1 && x.Value[0] != defaultScript).Select (x => "{\"" + x.Key + "\", \"" + x.Value [0] + "\"}").ToArray ();
            if (specifiedTerritories.Count () > 0) {
                result.Append (", ");
            }
            result.Append (String.Join (", ", specifiedTerritories));
            result.Append ("}}");
            return result.ToString ();
        }

        static void Main (string[] args)
        {
            var document = XDocument.Load ("/Users/Brent/Downloads/core/common/supplemental/supplementalData.xml");

            var scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified = new Dictionary<string, List<string>> ();
            string defaultLocale = document.XPathSelectElement ("/supplementalData/parentLocales/parentLocale[@parent='root']").Attribute("locales").Value;
            foreach (var entry in defaultLocale.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries)) {
                int indexOfUnderscore = entry.IndexOf ('_');
                string language = entry.Substring (0, indexOfUnderscore);
                string script = entry.Substring (indexOfUnderscore + 1);
                if (!scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified.ContainsKey (language)) {
                    scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified.Add (language, new List<string> ());
                }
                scriptIfLanguageHasMultiplePossibilitiesAndRegionHasNoneSpecified [language].Add (script);
            }

            var languageTerritoryScript = new Dictionary<string, Dictionary<string, List<string>>> ();
            var languagePrimaryScripts = new Dictionary<string, List<string>> ();
            var languageInfo = document.XPathSelectElements ("/supplementalData/languageData/language");
            foreach (var languageNode in languageInfo) {
                bool isSecondary = languageNode.Attribute ("alt") != null && languageNode.Attribute ("alt").Value == "secondary";
                string language = languageNode.Attribute ("type").Value;
                if (!languageTerritoryScript.ContainsKey (language)) {
                    languageTerritoryScript.Add (language, new Dictionary<string, List<string>> ());
                }
                if (languageNode.Attribute ("territories") != null) {
                    String[] territories = languageNode.Attribute ("territories").Value.Split (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    if (languageNode.Attribute ("scripts") != null) {
                        String[] scripts = languageNode.Attribute ("scripts").Value.Split (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        foreach (string territory in territories) {
                            if (!languageTerritoryScript [language].ContainsKey (territory)) {
                                languageTerritoryScript [language].Add (territory, new List<string> ());
                            }
                            foreach (string script in scripts) {
                                languageTerritoryScript [language] [territory].Add (script);
                                if (!isSecondary) {
                                    if (!languagePrimaryScripts.ContainsKey (language)) {
                                        languagePrimaryScripts.Add (language, new List<string> ());
                                    }
                                    languagePrimaryScripts [language].Add (script);
                                }
                            }
                        }
                    } else {
                        foreach (string territory in territories) {
                            if (!languageTerritoryScript [language].ContainsKey (territory)) {
                                languageTerritoryScript [language].Add (territory, new List<string> ());
                            }
                        }
                    }
                } else if (languageNode.Attributes ("scripts") != null) {
                    String[] scripts = languageNode.Attribute ("scripts").Value.Split (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    if (!languageTerritoryScript [language].ContainsKey ("")) {
                        languageTerritoryScript [language].Add ("", new List<string> ());
                    }
                    foreach (string script in scripts) {
                        languageTerritoryScript [language] [""].Add (script);
                        if (!isSecondary) {
                            if (!languagePrimaryScripts.ContainsKey (language)) {
                                languagePrimaryScripts.Add (language, new List<string> ());
                            }
                            languagePrimaryScripts [language].Add (script);
                        }
                    }
                }
            }

            var territoryInfo = document.XPathSelectElements ("/supplementalData/territoryInfo/territory");
            foreach (var territoryNode in territoryInfo) {
                string territory = territoryNode.Attribute ("type").Value;
                foreach (var languagePopulationNode in territoryNode.Elements()) {
                    string languageAndMaybeScript = languagePopulationNode.Attribute ("type").Value;
                    int underscoreIndex = languageAndMaybeScript.IndexOf ('_');
                    if (underscoreIndex != -1) {
                        string language = languageAndMaybeScript.Substring (0, underscoreIndex);
                        string script = languageAndMaybeScript.Substring (underscoreIndex + 1);
                        if (!languageTerritoryScript.ContainsKey (language)) {
                            languageTerritoryScript.Add (language, new Dictionary<string, List<string>> ());
                        }
                        if (!languageTerritoryScript [language].ContainsKey (territory)) {
                            languageTerritoryScript [language].Add (territory, new List<string> ());
                        }
                        languageTerritoryScript [language] [territory].Clear (); //we've gotten a specific script specification for the region and language, so use it, and only it.
                        languageTerritoryScript [language] [territory].Add (script);
                    } else {
                        string language = languageAndMaybeScript;
                        if (!languageTerritoryScript.ContainsKey (language)) {
                            languageTerritoryScript.Add (language, new Dictionary<string, List<string>> ());
                        }
                        if (!languageTerritoryScript [language].ContainsKey (territory)) {
                            languageTerritoryScript [language].Add (territory, new List<string> ());
                        }
                    }
                }
            }

            StringBuilder result = new StringBuilder ("static std::map<std::string /*ISO 639-1*/, std::map<std::string/*ISO ISO3166-1 Alpha 2 or empty*/, std::string /*ISO 15924*/>> table = {");
            result.Append (System.Environment.NewLine);
            result.Append (String.Join (", " + System.Environment.NewLine, languageTerritoryScript.Where (x => x.Value.Count > 0).OrderBy(x => x.Key).Select (x => LanguageEntryToString (x, languagePrimaryScripts))));
            result.Append (System.Environment.NewLine);
            result.Append ("}");
            string stringResult = result.ToString ();
            System.Diagnostics.Debug.WriteLine (stringResult);
        }
    }
}   
查看更多
三岁会撩人
4楼-- · 2019-03-31 00:57

I've created a Java version that does this, available here. Basically, it takes the table in the above answer (with additional entries) and ports it to a Map<String, Map<String, String>> containing the useful information, then a simple lookup method is used. To use this class in your project, just call:

String script = LocaleUtilities.getScript(Locale.getDefault());

to get the script for the default locale.

查看更多
放荡不羁爱自由
5楼-- · 2019-03-31 00:59

But en_US doesn't have a script tag in it, it's just an identifier. What would you suggest to improve the documentation here?

If you want to guess what the script is likely to be, then you can use uloc_addLikelySubtags() (or ICU4J equivalent) which will map en to en_Latn_US, but will leave zh_Hant_CN as zh_Hant_CN, using the CLDR likelySubtag data.

查看更多
smile是对你的礼貌
6楼-- · 2019-03-31 01:12

The C part of ICU4C contains uscript_getCode() call that should do what you are looking for.

查看更多
登录 后发表回答