Search code examples
internationalizationisoicu

Get an ISO 15924 script code for a given IETF Language tag (or ISO 639-ISO 3166-1 pair)


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.


Solution

  • 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);
            }
        }
    }