On Thu, Sep 8, 2016 at 8:16 AM, Tom Lane <t...@sss.pgh.pa.us> wrote: >> I understand that in principle, but I don't see operating system >> providers shipping a bunch of ICU versions to facilitate that. They >> will usually ship one. > > I agree with that estimate, and I would further venture that even if we > wanted to bundle ICU into our tarballs, distributors would rip it out > again on security grounds.
I agree that we're not going to bundle our own ICU. And, that packagers have to be more or less on board with whatever plan we come up with for any this to be of much practical value. The plan itself is at least as important as the patch. > This is a problem, if ICU won't guarantee cross-version compatibility, > because it destroys the argument that moving to ICU would offer us > collation behavior stability. Not exactly. Peter E. didn't seem to be aware that there is an ICU collator versioning concept (perhaps I misunderstood, though). It might be that in practice, the locales are very stable, so it almost doesn't matter that it's annoying when they change. Note that "collators" are versioned in a sophisticated way, not locales. You can build the attached simple C program to see the versions of available collators from each locale, as follows: $ gcc icu-test.c -licui18n -licuuc -o icu-coll-versions $ ./icu-coll-versions | head -n 20 Collator | ICU Version | UCA Version ----------------------------------------------------------------------------- Afrikaans | 99-38-00-00 | 07-00-00-00 Afrikaans (Namibia) | 99-38-00-00 | 07-00-00-00 Afrikaans (South Africa) | 99-38-00-00 | 07-00-00-00 Aghem | 99-38-00-00 | 07-00-00-00 Aghem (Cameroon) | 99-38-00-00 | 07-00-00-00 Akan | 99-38-00-00 | 07-00-00-00 Akan (Ghana) | 99-38-00-00 | 07-00-00-00 Amharic | 99-38-00-00 | 07-00-00-00 Amharic (Ethiopia) | 99-38-00-00 | 07-00-00-00 Arabic | 99-38-1B-01 | 07-00-00-00 Arabic (World) | 99-38-1B-01 | 07-00-00-00 Arabic (United Arab Emirates) | 99-38-1B-01 | 07-00-00-00 Arabic (Bahrain) | 99-38-1B-01 | 07-00-00-00 Arabic (Djibouti) | 99-38-1B-01 | 07-00-00-00 Arabic (Algeria) | 99-38-1B-01 | 07-00-00-00 Arabic (Egypt) | 99-38-1B-01 | 07-00-00-00 Arabic (Western Sahara) | 99-38-1B-01 | 07-00-00-00 Arabic (Eritrea) | 99-38-1B-01 | 07-00-00-00 I also attach a full list from my Ubuntu 16.04 laptop. I'll try to find some other system to generate output from, to see how close it matches what I happen to have here. "ICU version" here is an opaque 32-bit integer [1]. I'd be interested to see how much the output of this program differs from one major version of ICU to the next. Collations will change. of course, but not that often. It's not the end of the world if somebody has to REINDEX when they change major OS version. It would be nice if everything just continued to work with no further input from the user, but it's not essential, assuming that collation are pretty stable in practice, which I think they are. It is a total disaster if a mismatch in collations is initially undetected, though. Another issue that nobody has mentioned here, I think, is that the glibc people just don't seem to care about our use-case (Carlos O'Donnell basically said as much, during the strxfrm() debacle earlier this year, but it wasn't limited to how we were relying on strxfrm() at that time). Since it's almost certainly true that other major database systems are critically reliant on ICU's strxfrm() agreeing with strcoll (substitute ICU equivalent spellings), and issues beyond that, it stands to reason that they take that stuff very seriously. It would be really nice to get back abbreviated keys for collated text, IMV. I think ICU gets us that. Even if we used ICU in exactly the same way as we use the C standard library today, that general sense of stability being critical that ICU has would still be a big advantage. If ICU drops the ball on collation stability, or strxfrm() disagreeing with strcoll(), it's a huge problem for lots of groups of people, not just us. [1] https://ssl.icu-project.org/apiref/icu4c/ucol_8h.html#af756972781ac556a62e48cbd509ea4a6 -- Peter Geoghegan
Collator | ICU Version | UCA Version ----------------------------------------------------------------------------- Afrikaans | 99-38-00-00 | 07-00-00-00 Afrikaans (Namibia) | 99-38-00-00 | 07-00-00-00 Afrikaans (South Africa) | 99-38-00-00 | 07-00-00-00 Aghem | 99-38-00-00 | 07-00-00-00 Aghem (Cameroon) | 99-38-00-00 | 07-00-00-00 Akan | 99-38-00-00 | 07-00-00-00 Akan (Ghana) | 99-38-00-00 | 07-00-00-00 Amharic | 99-38-00-00 | 07-00-00-00 Amharic (Ethiopia) | 99-38-00-00 | 07-00-00-00 Arabic | 99-38-1B-01 | 07-00-00-00 Arabic (World) | 99-38-1B-01 | 07-00-00-00 Arabic (United Arab Emirates) | 99-38-1B-01 | 07-00-00-00 Arabic (Bahrain) | 99-38-1B-01 | 07-00-00-00 Arabic (Djibouti) | 99-38-1B-01 | 07-00-00-00 Arabic (Algeria) | 99-38-1B-01 | 07-00-00-00 Arabic (Egypt) | 99-38-1B-01 | 07-00-00-00 Arabic (Western Sahara) | 99-38-1B-01 | 07-00-00-00 Arabic (Eritrea) | 99-38-1B-01 | 07-00-00-00 Arabic (Israel) | 99-38-1B-01 | 07-00-00-00 Arabic (Iraq) | 99-38-1B-01 | 07-00-00-00 Arabic (Jordan) | 99-38-1B-01 | 07-00-00-00 Arabic (Comoros) | 99-38-1B-01 | 07-00-00-00 Arabic (Kuwait) | 99-38-1B-01 | 07-00-00-00 Arabic (Lebanon) | 99-38-1B-01 | 07-00-00-00 Arabic (Libya) | 99-38-1B-01 | 07-00-00-00 Arabic (Morocco) | 99-38-1B-01 | 07-00-00-00 Arabic (Mauritania) | 99-38-1B-01 | 07-00-00-00 Arabic (Oman) | 99-38-1B-01 | 07-00-00-00 Arabic (Palestinian Territories) | 99-38-1B-01 | 07-00-00-00 Arabic (Qatar) | 99-38-1B-01 | 07-00-00-00 Arabic (Saudi Arabia) | 99-38-1B-01 | 07-00-00-00 Arabic (Sudan) | 99-38-1B-01 | 07-00-00-00 Arabic (Somalia) | 99-38-1B-01 | 07-00-00-00 Arabic (South Sudan) | 99-38-1B-01 | 07-00-00-00 Arabic (Syria) | 99-38-1B-01 | 07-00-00-00 Arabic (Chad) | 99-38-1B-01 | 07-00-00-00 Arabic (Tunisia) | 99-38-1B-01 | 07-00-00-00 Arabic (Yemen) | 99-38-1B-01 | 07-00-00-00 Assamese | 99-38-1B-01 | 07-00-00-00 Assamese (India) | 99-38-1B-01 | 07-00-00-00 Asu | 99-38-00-00 | 07-00-00-00 Asu (Tanzania) | 99-38-00-00 | 07-00-00-00 Azerbaijani | 99-38-1B-01 | 07-00-00-00 Azerbaijani (Cyrillic) | 99-38-1B-01 | 07-00-00-00 Azerbaijani (Cyrillic, Azerbaijan) | 99-38-1B-01 | 07-00-00-00 Azerbaijani (Latin) | 99-38-1B-01 | 07-00-00-00 Azerbaijani (Latin, Azerbaijan) | 99-38-1B-01 | 07-00-00-00 Basaa | 99-38-00-00 | 07-00-00-00 Basaa (Cameroon) | 99-38-00-00 | 07-00-00-00 Belarusian | 99-38-1B-01 | 07-00-00-00 Belarusian (Belarus) | 99-38-1B-01 | 07-00-00-00 Bemba | 99-38-00-00 | 07-00-00-00 Bemba (Zambia) | 99-38-00-00 | 07-00-00-00 Bena | 99-38-00-00 | 07-00-00-00 Bena (Tanzania) | 99-38-00-00 | 07-00-00-00 Bulgarian | 99-38-1B-01 | 07-00-00-00 Bulgarian (Bulgaria) | 99-38-1B-01 | 07-00-00-00 Bambara | 99-38-00-00 | 07-00-00-00 Bambara (Latin) | 99-38-00-00 | 07-00-00-00 Bambara (Latin, Mali) | 99-38-00-00 | 07-00-00-00 Bengali | 99-38-1B-01 | 07-00-00-00 Bengali (Bangladesh) | 99-38-1B-01 | 07-00-00-00 Bengali (India) | 99-38-1B-01 | 07-00-00-00 Tibetan | 99-38-00-00 | 07-00-00-00 Tibetan (China) | 99-38-00-00 | 07-00-00-00 Tibetan (India) | 99-38-00-00 | 07-00-00-00 Breton | 99-38-00-00 | 07-00-00-00 Breton (France) | 99-38-00-00 | 07-00-00-00 Bodo | 99-38-00-00 | 07-00-00-00 Bodo (India) | 99-38-00-00 | 07-00-00-00 Bosnian | 99-38-1B-01 | 07-00-00-00 Bosnian (Cyrillic) | 99-38-1B-01 | 07-00-00-00 Bosnian (Cyrillic, Bosnia & Herzegovina) | 99-38-1B-01 | 07-00-00-00 Bosnian (Latin) | 99-38-1B-01 | 07-00-00-00 Bosnian (Latin, Bosnia & Herzegovina) | 99-38-1B-01 | 07-00-00-00 Catalan | 99-38-00-00 | 07-00-00-00 Catalan (Andorra) | 99-38-00-00 | 07-00-00-00 Catalan (Spain) | 99-38-00-00 | 07-00-00-00 Catalan (France) | 99-38-00-00 | 07-00-00-00 Catalan (Italy) | 99-38-00-00 | 07-00-00-00 Chiga | 99-38-00-00 | 07-00-00-00 Chiga (Uganda) | 99-38-00-00 | 07-00-00-00 Cherokee | 99-38-00-00 | 07-00-00-00 Cherokee (United States) | 99-38-00-00 | 07-00-00-00 Czech | 99-38-1B-01 | 07-00-00-00 Czech (Czech Republic) | 99-38-1B-01 | 07-00-00-00 Welsh | 99-38-1B-01 | 07-00-00-00 Welsh (United Kingdom) | 99-38-1B-01 | 07-00-00-00 Danish | 99-38-1B-01 | 07-00-00-00 Danish (Denmark) | 99-38-1B-01 | 07-00-00-00 Danish (Greenland) | 99-38-1B-01 | 07-00-00-00 Taita | 99-38-00-00 | 07-00-00-00 Taita (Kenya) | 99-38-00-00 | 07-00-00-00 German | 99-38-00-00 | 07-00-00-00 German (Austria) | 99-38-00-00 | 07-00-00-00 German (Belgium) | 99-38-00-00 | 07-00-00-00 German (Switzerland) | 99-38-00-00 | 07-00-00-00 German (Germany) | 99-38-00-00 | 07-00-00-00 German (Liechtenstein) | 99-38-00-00 | 07-00-00-00 German (Luxembourg) | 99-38-00-00 | 07-00-00-00 Zarma | 99-38-00-00 | 07-00-00-00 Zarma (Niger) | 99-38-00-00 | 07-00-00-00 Lower Sorbian | 99-38-1B-01 | 07-00-00-00 Lower Sorbian (Germany) | 99-38-1B-01 | 07-00-00-00 Duala | 99-38-00-00 | 07-00-00-00 Duala (Cameroon) | 99-38-00-00 | 07-00-00-00 Jola-Fonyi | 99-38-00-00 | 07-00-00-00 Jola-Fonyi (Senegal) | 99-38-00-00 | 07-00-00-00 Dzongkha | 99-38-00-00 | 07-00-00-00 Dzongkha (Bhutan) | 99-38-00-00 | 07-00-00-00 Embu | 99-38-00-00 | 07-00-00-00 Embu (Kenya) | 99-38-00-00 | 07-00-00-00 Ewe | 99-38-1B-01 | 07-00-00-00 Ewe (Ghana) | 99-38-1B-01 | 07-00-00-00 Ewe (Togo) | 99-38-1B-01 | 07-00-00-00 Greek | 99-38-1B-01 | 07-00-00-00 Greek (Cyprus) | 99-38-1B-01 | 07-00-00-00 Greek (Greece) | 99-38-1B-01 | 07-00-00-00 English | 99-38-00-00 | 07-00-00-00 English (World) | 99-38-00-00 | 07-00-00-00 English (Europe) | 99-38-00-00 | 07-00-00-00 English (Antigua & Barbuda) | 99-38-00-00 | 07-00-00-00 English (Anguilla) | 99-38-00-00 | 07-00-00-00 English (American Samoa) | 99-38-00-00 | 07-00-00-00 English (Australia) | 99-38-00-00 | 07-00-00-00 English (Barbados) | 99-38-00-00 | 07-00-00-00 English (Belgium) | 99-38-00-00 | 07-00-00-00 English (Bermuda) | 99-38-00-00 | 07-00-00-00 English (Bahamas) | 99-38-00-00 | 07-00-00-00 English (Botswana) | 99-38-00-00 | 07-00-00-00 English (Belize) | 99-38-00-00 | 07-00-00-00 English (Canada) | 99-38-00-00 | 07-00-00-00 English (Cocos [Keeling] Islands) | 99-38-00-00 | 07-00-00-00 English (Cook Islands) | 99-38-00-00 | 07-00-00-00 English (Cameroon) | 99-38-00-00 | 07-00-00-00 English (Christmas Island) | 99-38-00-00 | 07-00-00-00 English (Diego Garcia) | 99-38-00-00 | 07-00-00-00 English (Dominica) | 99-38-00-00 | 07-00-00-00 English (Eritrea) | 99-38-00-00 | 07-00-00-00 English (Fiji) | 99-38-00-00 | 07-00-00-00 English (Falkland Islands) | 99-38-00-00 | 07-00-00-00 English (Micronesia) | 99-38-00-00 | 07-00-00-00 English (United Kingdom) | 99-38-00-00 | 07-00-00-00 English (Grenada) | 99-38-00-00 | 07-00-00-00 English (Guernsey) | 99-38-00-00 | 07-00-00-00 English (Ghana) | 99-38-00-00 | 07-00-00-00 English (Gibraltar) | 99-38-00-00 | 07-00-00-00 English (Gambia) | 99-38-00-00 | 07-00-00-00 English (Guam) | 99-38-00-00 | 07-00-00-00 English (Guyana) | 99-38-00-00 | 07-00-00-00 English (Hong Kong SAR China) | 99-38-00-00 | 07-00-00-00 English (Ireland) | 99-38-00-00 | 07-00-00-00 English (Isle of Man) | 99-38-00-00 | 07-00-00-00 English (India) | 99-38-00-00 | 07-00-00-00 English (British Indian Ocean Territory) | 99-38-00-00 | 07-00-00-00 English (Jersey) | 99-38-00-00 | 07-00-00-00 English (Jamaica) | 99-38-00-00 | 07-00-00-00 English (Kenya) | 99-38-00-00 | 07-00-00-00 English (Kiribati) | 99-38-00-00 | 07-00-00-00 English (St. Kitts & Nevis) | 99-38-00-00 | 07-00-00-00 English (Cayman Islands) | 99-38-00-00 | 07-00-00-00 English (St. Lucia) | 99-38-00-00 | 07-00-00-00 English (Liberia) | 99-38-00-00 | 07-00-00-00 English (Lesotho) | 99-38-00-00 | 07-00-00-00 English (Madagascar) | 99-38-00-00 | 07-00-00-00 English (Marshall Islands) | 99-38-00-00 | 07-00-00-00 English (Macau SAR China) | 99-38-00-00 | 07-00-00-00 English (Northern Mariana Islands) | 99-38-00-00 | 07-00-00-00 English (Montserrat) | 99-38-00-00 | 07-00-00-00 English (Malta) | 99-38-00-00 | 07-00-00-00 English (Mauritius) | 99-38-00-00 | 07-00-00-00 English (Malawi) | 99-38-00-00 | 07-00-00-00 English (Malaysia) | 99-38-00-00 | 07-00-00-00 English (Namibia) | 99-38-00-00 | 07-00-00-00 English (Norfolk Island) | 99-38-00-00 | 07-00-00-00 English (Nigeria) | 99-38-00-00 | 07-00-00-00 English (Nauru) | 99-38-00-00 | 07-00-00-00 English (Niue) | 99-38-00-00 | 07-00-00-00 English (New Zealand) | 99-38-00-00 | 07-00-00-00 English (Papua New Guinea) | 99-38-00-00 | 07-00-00-00 English (Philippines) | 99-38-00-00 | 07-00-00-00 English (Pakistan) | 99-38-00-00 | 07-00-00-00 English (Pitcairn Islands) | 99-38-00-00 | 07-00-00-00 English (Puerto Rico) | 99-38-00-00 | 07-00-00-00 English (Palau) | 99-38-00-00 | 07-00-00-00 English (Rwanda) | 99-38-00-00 | 07-00-00-00 English (Solomon Islands) | 99-38-00-00 | 07-00-00-00 English (Seychelles) | 99-38-00-00 | 07-00-00-00 English (Sudan) | 99-38-00-00 | 07-00-00-00 English (Singapore) | 99-38-00-00 | 07-00-00-00 English (St. Helena) | 99-38-00-00 | 07-00-00-00 English (Sierra Leone) | 99-38-00-00 | 07-00-00-00 English (South Sudan) | 99-38-00-00 | 07-00-00-00 English (Sint Maarten) | 99-38-00-00 | 07-00-00-00 English (Swaziland) | 99-38-00-00 | 07-00-00-00 English (Turks & Caicos Islands) | 99-38-00-00 | 07-00-00-00 English (Tokelau) | 99-38-00-00 | 07-00-00-00 English (Tonga) | 99-38-00-00 | 07-00-00-00 English (Trinidad & Tobago) | 99-38-00-00 | 07-00-00-00 English (Tuvalu) | 99-38-00-00 | 07-00-00-00 English (Tanzania) | 99-38-00-00 | 07-00-00-00 English (Uganda) | 99-38-00-00 | 07-00-00-00 English (U.S. Outlying Islands) | 99-38-00-00 | 07-00-00-00 English (United States) | 99-38-00-00 | 07-00-00-00 English (United States, Computer) | 99-38-1B-01 | 07-00-00-00 English (St. Vincent & Grenadines) | 99-38-00-00 | 07-00-00-00 English (British Virgin Islands) | 99-38-00-00 | 07-00-00-00 English (U.S. Virgin Islands) | 99-38-00-00 | 07-00-00-00 English (Vanuatu) | 99-38-00-00 | 07-00-00-00 English (Samoa) | 99-38-00-00 | 07-00-00-00 English (South Africa) | 99-38-00-00 | 07-00-00-00 English (Zambia) | 99-38-00-00 | 07-00-00-00 English (Zimbabwe) | 99-38-00-00 | 07-00-00-00 Esperanto | 99-38-1B-01 | 07-00-00-00 Spanish | 99-38-1B-01 | 07-00-00-00 Spanish (Latin America) | 99-38-1B-01 | 07-00-00-00 Spanish (Argentina) | 99-38-1B-01 | 07-00-00-00 Spanish (Bolivia) | 99-38-1B-01 | 07-00-00-00 Spanish (Chile) | 99-38-1B-01 | 07-00-00-00 Spanish (Colombia) | 99-38-1B-01 | 07-00-00-00 Spanish (Costa Rica) | 99-38-1B-01 | 07-00-00-00 Spanish (Cuba) | 99-38-1B-01 | 07-00-00-00 Spanish (Dominican Republic) | 99-38-1B-01 | 07-00-00-00 Spanish (Ceuta & Melilla) | 99-38-1B-01 | 07-00-00-00 Spanish (Ecuador) | 99-38-1B-01 | 07-00-00-00 Spanish (Spain) | 99-38-1B-01 | 07-00-00-00 Spanish (Equatorial Guinea) | 99-38-1B-01 | 07-00-00-00 Spanish (Guatemala) | 99-38-1B-01 | 07-00-00-00 Spanish (Honduras) | 99-38-1B-01 | 07-00-00-00 Spanish (Canary Islands) | 99-38-1B-01 | 07-00-00-00 Spanish (Mexico) | 99-38-1B-01 | 07-00-00-00 Spanish (Nicaragua) | 99-38-1B-01 | 07-00-00-00 Spanish (Panama) | 99-38-1B-01 | 07-00-00-00 Spanish (Peru) | 99-38-1B-01 | 07-00-00-00 Spanish (Philippines) | 99-38-1B-01 | 07-00-00-00 Spanish (Puerto Rico) | 99-38-1B-01 | 07-00-00-00 Spanish (Paraguay) | 99-38-1B-01 | 07-00-00-00 Spanish (El Salvador) | 99-38-1B-01 | 07-00-00-00 Spanish (United States) | 99-38-1B-01 | 07-00-00-00 Spanish (Uruguay) | 99-38-1B-01 | 07-00-00-00 Spanish (Venezuela) | 99-38-1B-01 | 07-00-00-00 Estonian | 99-38-1B-01 | 07-00-00-00 Estonian (Estonia) | 99-38-1B-01 | 07-00-00-00 Basque | 99-38-00-00 | 07-00-00-00 Basque (Spain) | 99-38-00-00 | 07-00-00-00 Ewondo | 99-38-00-00 | 07-00-00-00 Ewondo (Cameroon) | 99-38-00-00 | 07-00-00-00 Persian | 99-38-1B-01 | 07-00-00-00 Persian (Afghanistan) | 99-38-1B-01 | 07-00-00-00 Persian (Iran) | 99-38-1B-01 | 07-00-00-00 Fulah | 99-38-00-00 | 07-00-00-00 Fulah (Cameroon) | 99-38-00-00 | 07-00-00-00 Fulah (Guinea) | 99-38-00-00 | 07-00-00-00 Fulah (Mauritania) | 99-38-00-00 | 07-00-00-00 Fulah (Senegal) | 99-38-00-00 | 07-00-00-00 Finnish | 99-38-1B-01 | 07-00-00-00 Finnish (Finland) | 99-38-1B-01 | 07-00-00-00 Filipino | 99-38-1B-01 | 07-00-00-00 Filipino (Philippines) | 99-38-1B-01 | 07-00-00-00 Faroese | 99-38-1B-01 | 07-00-00-00 Faroese (Faroe Islands) | 99-38-1B-01 | 07-00-00-00 French | 99-38-00-00 | 07-00-00-00 French (Belgium) | 99-38-00-00 | 07-00-00-00 French (Burkina Faso) | 99-38-00-00 | 07-00-00-00 French (Burundi) | 99-38-00-00 | 07-00-00-00 French (Benin) | 99-38-00-00 | 07-00-00-00 French (St. Barthélemy) | 99-38-00-00 | 07-00-00-00 French (Canada) | 99-38-1B-01 | 07-00-00-00 French (Congo - Kinshasa) | 99-38-00-00 | 07-00-00-00 French (Central African Republic) | 99-38-00-00 | 07-00-00-00 French (Congo - Brazzaville) | 99-38-00-00 | 07-00-00-00 French (Switzerland) | 99-38-00-00 | 07-00-00-00 French (Côte dâIvoire) | 99-38-00-00 | 07-00-00-00 French (Cameroon) | 99-38-00-00 | 07-00-00-00 French (Djibouti) | 99-38-00-00 | 07-00-00-00 French (Algeria) | 99-38-00-00 | 07-00-00-00 French (France) | 99-38-00-00 | 07-00-00-00 French (Gabon) | 99-38-00-00 | 07-00-00-00 French (French Guiana) | 99-38-00-00 | 07-00-00-00 French (Guinea) | 99-38-00-00 | 07-00-00-00 French (Guadeloupe) | 99-38-00-00 | 07-00-00-00 French (Equatorial Guinea) | 99-38-00-00 | 07-00-00-00 French (Haiti) | 99-38-00-00 | 07-00-00-00 French (Comoros) | 99-38-00-00 | 07-00-00-00 French (Luxembourg) | 99-38-00-00 | 07-00-00-00 French (Morocco) | 99-38-00-00 | 07-00-00-00 French (Monaco) | 99-38-00-00 | 07-00-00-00 French (St. Martin) | 99-38-00-00 | 07-00-00-00 French (Madagascar) | 99-38-00-00 | 07-00-00-00 French (Mali) | 99-38-00-00 | 07-00-00-00 French (Martinique) | 99-38-00-00 | 07-00-00-00 French (Mauritania) | 99-38-00-00 | 07-00-00-00 French (Mauritius) | 99-38-00-00 | 07-00-00-00 French (New Caledonia) | 99-38-00-00 | 07-00-00-00 French (Niger) | 99-38-00-00 | 07-00-00-00 French (French Polynesia) | 99-38-00-00 | 07-00-00-00 French (St. Pierre & Miquelon) | 99-38-00-00 | 07-00-00-00 French (Réunion) | 99-38-00-00 | 07-00-00-00 French (Rwanda) | 99-38-00-00 | 07-00-00-00 French (Seychelles) | 99-38-00-00 | 07-00-00-00 French (Senegal) | 99-38-00-00 | 07-00-00-00 French (Syria) | 99-38-00-00 | 07-00-00-00 French (Chad) | 99-38-00-00 | 07-00-00-00 French (Togo) | 99-38-00-00 | 07-00-00-00 French (Tunisia) | 99-38-00-00 | 07-00-00-00 French (Vanuatu) | 99-38-00-00 | 07-00-00-00 French (Wallis & Futuna) | 99-38-00-00 | 07-00-00-00 French (Mayotte) | 99-38-00-00 | 07-00-00-00 Friulian | 99-38-00-00 | 07-00-00-00 Friulian (Italy) | 99-38-00-00 | 07-00-00-00 Western Frisian | 99-38-00-00 | 07-00-00-00 Western Frisian (Netherlands) | 99-38-00-00 | 07-00-00-00 Irish | 99-38-00-00 | 07-00-00-00 Irish (Ireland) | 99-38-00-00 | 07-00-00-00 Scottish Gaelic | 99-38-00-00 | 07-00-00-00 Scottish Gaelic (United Kingdom) | 99-38-00-00 | 07-00-00-00 Galician | 99-38-1B-01 | 07-00-00-00 Galician (Spain) | 99-38-1B-01 | 07-00-00-00 Swiss German | 99-38-00-00 | 07-00-00-00 Swiss German (Switzerland) | 99-38-00-00 | 07-00-00-00 Swiss German (France) | 99-38-00-00 | 07-00-00-00 Swiss German (Liechtenstein) | 99-38-00-00 | 07-00-00-00 Gujarati | 99-38-1B-01 | 07-00-00-00 Gujarati (India) | 99-38-1B-01 | 07-00-00-00 Gusii | 99-38-00-00 | 07-00-00-00 Gusii (Kenya) | 99-38-00-00 | 07-00-00-00 Manx | 99-38-00-00 | 07-00-00-00 Manx (Isle of Man) | 99-38-00-00 | 07-00-00-00 Hausa | 99-38-1B-01 | 07-00-00-00 Hausa (Latin) | 99-38-1B-01 | 07-00-00-00 Hausa (Latin, Ghana) | 99-38-1B-01 | 07-00-00-00 Hausa (Latin, Niger) | 99-38-1B-01 | 07-00-00-00 Hausa (Latin, Nigeria) | 99-38-1B-01 | 07-00-00-00 Hawaiian | 99-38-1B-01 | 07-00-00-00 Hawaiian (United States) | 99-38-1B-01 | 07-00-00-00 Hebrew | 99-38-1B-01 | 07-00-00-00 Hebrew (Israel) | 99-38-1B-01 | 07-00-00-00 Hindi | 99-38-1B-01 | 07-00-00-00 Hindi (India) | 99-38-1B-01 | 07-00-00-00 Croatian | 99-38-1B-01 | 07-00-00-00 Croatian (Bosnia & Herzegovina) | 99-38-1B-01 | 07-00-00-00 Croatian (Croatia) | 99-38-1B-01 | 07-00-00-00 Upper Sorbian | 99-38-1B-01 | 07-00-00-00 Upper Sorbian (Germany) | 99-38-1B-01 | 07-00-00-00 Hungarian | 99-38-1B-01 | 07-00-00-00 Hungarian (Hungary) | 99-38-1B-01 | 07-00-00-00 Armenian | 99-38-1B-01 | 07-00-00-00 Armenian (Armenia) | 99-38-1B-01 | 07-00-00-00 Indonesian | 99-38-00-00 | 07-00-00-00 Indonesian (Indonesia) | 99-38-00-00 | 07-00-00-00 Igbo | 99-38-1B-01 | 07-00-00-00 Igbo (Nigeria) | 99-38-1B-01 | 07-00-00-00 Sichuan Yi | 99-38-00-00 | 07-00-00-00 Sichuan Yi (China) | 99-38-00-00 | 07-00-00-00 Icelandic | 99-38-1B-01 | 07-00-00-00 Icelandic (Iceland) | 99-38-1B-01 | 07-00-00-00 Italian | 99-38-00-00 | 07-00-00-00 Italian (Switzerland) | 99-38-00-00 | 07-00-00-00 Italian (Italy) | 99-38-00-00 | 07-00-00-00 Italian (San Marino) | 99-38-00-00 | 07-00-00-00 Japanese | 99-38-1B-01 | 07-00-00-00 Japanese (Japan) | 99-38-1B-01 | 07-00-00-00 Ngomba | 99-38-00-00 | 07-00-00-00 Ngomba (Cameroon) | 99-38-00-00 | 07-00-00-00 Machame | 99-38-00-00 | 07-00-00-00 Machame (Tanzania) | 99-38-00-00 | 07-00-00-00 Georgian | 99-38-00-00 | 07-00-00-00 Georgian (Georgia) | 99-38-00-00 | 07-00-00-00 Kabyle | 99-38-00-00 | 07-00-00-00 Kabyle (Algeria) | 99-38-00-00 | 07-00-00-00 Kamba | 99-38-00-00 | 07-00-00-00 Kamba (Kenya) | 99-38-00-00 | 07-00-00-00 Makonde | 99-38-00-00 | 07-00-00-00 Makonde (Tanzania) | 99-38-00-00 | 07-00-00-00 Kabuverdianu | 99-38-00-00 | 07-00-00-00 Kabuverdianu (Cape Verde) | 99-38-00-00 | 07-00-00-00 Koyra Chiini | 99-38-00-00 | 07-00-00-00 Koyra Chiini (Mali) | 99-38-00-00 | 07-00-00-00 Kikuyu | 99-38-00-00 | 07-00-00-00 Kikuyu (Kenya) | 99-38-00-00 | 07-00-00-00 Kazakh | 99-38-1B-01 | 07-00-00-00 Kazakh (Cyrillic) | 99-38-1B-01 | 07-00-00-00 Kazakh (Cyrillic, Kazakhstan) | 99-38-1B-01 | 07-00-00-00 Kako | 99-38-00-00 | 07-00-00-00 Kako (Cameroon) | 99-38-00-00 | 07-00-00-00 Kalaallisut | 99-38-1B-01 | 07-00-00-00 Kalaallisut (Greenland) | 99-38-1B-01 | 07-00-00-00 Kalenjin | 99-38-00-00 | 07-00-00-00 Kalenjin (Kenya) | 99-38-00-00 | 07-00-00-00 Khmer | 99-38-1B-01 | 07-00-00-00 Khmer (Cambodia) | 99-38-1B-01 | 07-00-00-00 Kannada | 99-38-1B-01 | 07-00-00-00 Kannada (India) | 99-38-1B-01 | 07-00-00-00 Korean | 99-38-1B-01 | 07-00-00-00 Korean (North Korea) | 99-38-1B-01 | 07-00-00-00 Korean (South Korea) | 99-38-1B-01 | 07-00-00-00 Konkani | 99-38-1B-01 | 07-00-00-00 Konkani (India) | 99-38-1B-01 | 07-00-00-00 Kashmiri | 99-38-00-00 | 07-00-00-00 Kashmiri (Arabic) | 99-38-00-00 | 07-00-00-00 Kashmiri (Arabic, India) | 99-38-00-00 | 07-00-00-00 Shambala | 99-38-00-00 | 07-00-00-00 Shambala (Tanzania) | 99-38-00-00 | 07-00-00-00 Bafia | 99-38-00-00 | 07-00-00-00 Bafia (Cameroon) | 99-38-00-00 | 07-00-00-00 Colognian | 99-38-00-00 | 07-00-00-00 Colognian (Germany) | 99-38-00-00 | 07-00-00-00 Cornish | 99-38-00-00 | 07-00-00-00 Cornish (United Kingdom) | 99-38-00-00 | 07-00-00-00 Kyrgyz | 99-38-1B-01 | 07-00-00-00 Kyrgyz (Cyrillic) | 99-38-1B-01 | 07-00-00-00 Kyrgyz (Cyrillic, Kyrgyzstan) | 99-38-1B-01 | 07-00-00-00 Langi | 99-38-00-00 | 07-00-00-00 Langi (Tanzania) | 99-38-00-00 | 07-00-00-00 Luxembourgish | 99-38-00-00 | 07-00-00-00 Luxembourgish (Luxembourg) | 99-38-00-00 | 07-00-00-00 Ganda | 99-38-00-00 | 07-00-00-00 Ganda (Uganda) | 99-38-00-00 | 07-00-00-00 Lakota | 99-38-1B-01 | 07-00-00-00 Lakota (United States) | 99-38-1B-01 | 07-00-00-00 Lingala | 99-38-1B-01 | 07-00-00-00 Lingala (Angola) | 99-38-1B-01 | 07-00-00-00 Lingala (Congo - Kinshasa) | 99-38-1B-01 | 07-00-00-00 Lingala (Central African Republic) | 99-38-1B-01 | 07-00-00-00 Lingala (Congo - Brazzaville) | 99-38-1B-01 | 07-00-00-00 Lao | 99-38-00-00 | 07-00-00-00 Lao (Laos) | 99-38-00-00 | 07-00-00-00 Lithuanian | 99-38-1B-01 | 07-00-00-00 Lithuanian (Lithuania) | 99-38-1B-01 | 07-00-00-00 Luba-Katanga | 99-38-00-00 | 07-00-00-00 Luba-Katanga (Congo - Kinshasa) | 99-38-00-00 | 07-00-00-00 Luo | 99-38-00-00 | 07-00-00-00 Luo (Kenya) | 99-38-00-00 | 07-00-00-00 Luyia | 99-38-00-00 | 07-00-00-00 Luyia (Kenya) | 99-38-00-00 | 07-00-00-00 Latvian | 99-38-1B-01 | 07-00-00-00 Latvian (Latvia) | 99-38-1B-01 | 07-00-00-00 Masai | 99-38-00-00 | 07-00-00-00 Masai (Kenya) | 99-38-00-00 | 07-00-00-00 Masai (Tanzania) | 99-38-00-00 | 07-00-00-00 Meru | 99-38-00-00 | 07-00-00-00 Meru (Kenya) | 99-38-00-00 | 07-00-00-00 Morisyen | 99-38-00-00 | 07-00-00-00 Morisyen (Mauritius) | 99-38-00-00 | 07-00-00-00 Malagasy | 99-38-00-00 | 07-00-00-00 Malagasy (Madagascar) | 99-38-00-00 | 07-00-00-00 Makhuwa-Meetto | 99-38-00-00 | 07-00-00-00 Makhuwa-Meetto (Mozambique) | 99-38-00-00 | 07-00-00-00 Metaʼ | 99-38-00-00 | 07-00-00-00 Metaʼ (Cameroon) | 99-38-00-00 | 07-00-00-00 Macedonian | 99-38-1B-01 | 07-00-00-00 Macedonian (Macedonia) | 99-38-1B-01 | 07-00-00-00 Malayalam | 99-38-1B-01 | 07-00-00-00 Malayalam (India) | 99-38-1B-01 | 07-00-00-00 Mongolian | 99-38-00-00 | 07-00-00-00 Mongolian (Cyrillic) | 99-38-00-00 | 07-00-00-00 Mongolian (Cyrillic, Mongolia) | 99-38-00-00 | 07-00-00-00 Marathi | 99-38-1B-01 | 07-00-00-00 Marathi (India) | 99-38-1B-01 | 07-00-00-00 Malay | 99-38-00-00 | 07-00-00-00 Malay (Latin) | 99-38-00-00 | 07-00-00-00 Malay (Latin, Brunei) | 99-38-00-00 | 07-00-00-00 Malay (Latin, Malaysia) | 99-38-00-00 | 07-00-00-00 Malay (Latin, Singapore) | 99-38-00-00 | 07-00-00-00 Maltese | 99-38-1B-01 | 07-00-00-00 Maltese (Malta) | 99-38-1B-01 | 07-00-00-00 Mundang | 99-38-00-00 | 07-00-00-00 Mundang (Cameroon) | 99-38-00-00 | 07-00-00-00 Burmese | 99-38-1B-01 | 07-00-00-00 Burmese (Myanmar [Burma]) | 99-38-1B-01 | 07-00-00-00 Nama | 99-38-00-00 | 07-00-00-00 Nama (Namibia) | 99-38-00-00 | 07-00-00-00 Norwegian BokmÃ¥l | 99-38-1B-01 | 07-00-00-00 Norwegian BokmÃ¥l (Norway) | 99-38-1B-01 | 07-00-00-00 Norwegian BokmÃ¥l (Svalbard & Jan Mayen) | 99-38-1B-01 | 07-00-00-00 North Ndebele | 99-38-00-00 | 07-00-00-00 North Ndebele (Zimbabwe) | 99-38-00-00 | 07-00-00-00 Nepali | 99-38-00-00 | 07-00-00-00 Nepali (India) | 99-38-00-00 | 07-00-00-00 Nepali (Nepal) | 99-38-00-00 | 07-00-00-00 Dutch | 99-38-00-00 | 07-00-00-00 Dutch (Aruba) | 99-38-00-00 | 07-00-00-00 Dutch (Belgium) | 99-38-00-00 | 07-00-00-00 Dutch (Caribbean Netherlands) | 99-38-00-00 | 07-00-00-00 Dutch (Curaçao) | 99-38-00-00 | 07-00-00-00 Dutch (Netherlands) | 99-38-00-00 | 07-00-00-00 Dutch (Suriname) | 99-38-00-00 | 07-00-00-00 Dutch (Sint Maarten) | 99-38-00-00 | 07-00-00-00 Kwasio | 99-38-00-00 | 07-00-00-00 Kwasio (Cameroon) | 99-38-00-00 | 07-00-00-00 Norwegian Nynorsk | 99-38-1B-01 | 07-00-00-00 Norwegian Nynorsk (Norway) | 99-38-1B-01 | 07-00-00-00 Ngiemboon | 99-38-00-00 | 07-00-00-00 Ngiemboon (Cameroon) | 99-38-00-00 | 07-00-00-00 Nuer | 99-38-00-00 | 07-00-00-00 Nuer (Sudan) | 99-38-00-00 | 07-00-00-00 Nyankole | 99-38-00-00 | 07-00-00-00 Nyankole (Uganda) | 99-38-00-00 | 07-00-00-00 Oromo | 99-38-1B-01 | 07-00-00-00 Oromo (Ethiopia) | 99-38-1B-01 | 07-00-00-00 Oromo (Kenya) | 99-38-1B-01 | 07-00-00-00 Oriya | 99-38-1B-01 | 07-00-00-00 Oriya (India) | 99-38-1B-01 | 07-00-00-00 Ossetic | 99-38-00-00 | 07-00-00-00 Ossetic (Georgia) | 99-38-00-00 | 07-00-00-00 Ossetic (Russia) | 99-38-00-00 | 07-00-00-00 Punjabi | 99-38-1B-01 | 07-00-00-00 Punjabi (Arabic) | 99-38-1B-01 | 07-00-00-00 Punjabi (Arabic, Pakistan) | 99-38-1B-01 | 07-00-00-00 Punjabi (Gurmukhi) | 99-38-1B-01 | 07-00-00-00 Punjabi (Gurmukhi, India) | 99-38-1B-01 | 07-00-00-00 Polish | 99-38-1B-01 | 07-00-00-00 Polish (Poland) | 99-38-1B-01 | 07-00-00-00 Pashto | 99-38-1B-01 | 07-00-00-00 Pashto (Afghanistan) | 99-38-1B-01 | 07-00-00-00 Portuguese | 99-38-00-00 | 07-00-00-00 Portuguese (Angola) | 99-38-00-00 | 07-00-00-00 Portuguese (Brazil) | 99-38-00-00 | 07-00-00-00 Portuguese (Cape Verde) | 99-38-00-00 | 07-00-00-00 Portuguese (Guinea-Bissau) | 99-38-00-00 | 07-00-00-00 Portuguese (Macau SAR China) | 99-38-00-00 | 07-00-00-00 Portuguese (Mozambique) | 99-38-00-00 | 07-00-00-00 Portuguese (Portugal) | 99-38-00-00 | 07-00-00-00 Portuguese (São Tomé & PrÃncipe) | 99-38-00-00 | 07-00-00-00 Portuguese (Timor-Leste) | 99-38-00-00 | 07-00-00-00 Quechua | 99-38-00-00 | 07-00-00-00 Quechua (Bolivia) | 99-38-00-00 | 07-00-00-00 Quechua (Ecuador) | 99-38-00-00 | 07-00-00-00 Quechua (Peru) | 99-38-00-00 | 07-00-00-00 Romansh | 99-38-00-00 | 07-00-00-00 Romansh (Switzerland) | 99-38-00-00 | 07-00-00-00 Rundi | 99-38-00-00 | 07-00-00-00 Rundi (Burundi) | 99-38-00-00 | 07-00-00-00 Romanian | 99-38-1B-01 | 07-00-00-00 Romanian (Moldova) | 99-38-1B-01 | 07-00-00-00 Romanian (Romania) | 99-38-1B-01 | 07-00-00-00 Rombo | 99-38-00-00 | 07-00-00-00 Rombo (Tanzania) | 99-38-00-00 | 07-00-00-00 Russian | 99-38-1B-01 | 07-00-00-00 Russian (Belarus) | 99-38-1B-01 | 07-00-00-00 Russian (Kyrgyzstan) | 99-38-1B-01 | 07-00-00-00 Russian (Kazakhstan) | 99-38-1B-01 | 07-00-00-00 Russian (Moldova) | 99-38-1B-01 | 07-00-00-00 Russian (Russia) | 99-38-1B-01 | 07-00-00-00 Russian (Ukraine) | 99-38-1B-01 | 07-00-00-00 Kinyarwanda | 99-38-00-00 | 07-00-00-00 Kinyarwanda (Rwanda) | 99-38-00-00 | 07-00-00-00 Rwa | 99-38-00-00 | 07-00-00-00 Rwa (Tanzania) | 99-38-00-00 | 07-00-00-00 Sakha | 99-38-00-00 | 07-00-00-00 Sakha (Russia) | 99-38-00-00 | 07-00-00-00 Samburu | 99-38-00-00 | 07-00-00-00 Samburu (Kenya) | 99-38-00-00 | 07-00-00-00 Sangu | 99-38-00-00 | 07-00-00-00 Sangu (Tanzania) | 99-38-00-00 | 07-00-00-00 Northern Sami | 99-38-1B-01 | 07-00-00-00 Northern Sami (Finland) | 99-38-1B-01 | 07-00-00-00 Northern Sami (Norway) | 99-38-1B-01 | 07-00-00-00 Northern Sami (Sweden) | 99-38-1B-01 | 07-00-00-00 Sena | 99-38-00-00 | 07-00-00-00 Sena (Mozambique) | 99-38-00-00 | 07-00-00-00 Koyraboro Senni | 99-38-00-00 | 07-00-00-00 Koyraboro Senni (Mali) | 99-38-00-00 | 07-00-00-00 Sango | 99-38-00-00 | 07-00-00-00 Sango (Central African Republic) | 99-38-00-00 | 07-00-00-00 Tachelhit | 99-38-00-00 | 07-00-00-00 Tachelhit (Latin) | 99-38-00-00 | 07-00-00-00 Tachelhit (Latin, Morocco) | 99-38-00-00 | 07-00-00-00 Tachelhit (Tifinagh) | 99-38-00-00 | 07-00-00-00 Tachelhit (Tifinagh, Morocco) | 99-38-00-00 | 07-00-00-00 Sinhala | 99-38-1B-01 | 07-00-00-00 Sinhala (Sri Lanka) | 99-38-1B-01 | 07-00-00-00 Slovak | 99-38-1B-01 | 07-00-00-00 Slovak (Slovakia) | 99-38-1B-01 | 07-00-00-00 Slovenian | 99-38-1B-01 | 07-00-00-00 Slovenian (Slovenia) | 99-38-1B-01 | 07-00-00-00 Inari Sami | 99-38-1B-01 | 07-00-00-00 Inari Sami (Finland) | 99-38-1B-01 | 07-00-00-00 Shona | 99-38-00-00 | 07-00-00-00 Shona (Zimbabwe) | 99-38-00-00 | 07-00-00-00 Somali | 99-38-00-00 | 07-00-00-00 Somali (Djibouti) | 99-38-00-00 | 07-00-00-00 Somali (Ethiopia) | 99-38-00-00 | 07-00-00-00 Somali (Kenya) | 99-38-00-00 | 07-00-00-00 Somali (Somalia) | 99-38-00-00 | 07-00-00-00 Albanian | 99-38-1B-01 | 07-00-00-00 Albanian (Albania) | 99-38-1B-01 | 07-00-00-00 Albanian (Macedonia) | 99-38-1B-01 | 07-00-00-00 Albanian (Kosovo) | 99-38-1B-01 | 07-00-00-00 Serbian | 99-38-1B-01 | 07-00-00-00 Serbian (Cyrillic) | 99-38-1B-01 | 07-00-00-00 Serbian (Cyrillic, Bosnia & Herzegovina) | 99-38-1B-01 | 07-00-00-00 Serbian (Cyrillic, Montenegro) | 99-38-1B-01 | 07-00-00-00 Serbian (Cyrillic, Serbia) | 99-38-1B-01 | 07-00-00-00 Serbian (Cyrillic, Kosovo) | 99-38-1B-01 | 07-00-00-00 Serbian (Latin) | 99-38-1B-01 | 07-00-00-00 Serbian (Latin, Bosnia & Herzegovina) | 99-38-1B-01 | 07-00-00-00 Serbian (Latin, Montenegro) | 99-38-1B-01 | 07-00-00-00 Serbian (Latin, Serbia) | 99-38-1B-01 | 07-00-00-00 Serbian (Latin, Kosovo) | 99-38-1B-01 | 07-00-00-00 Swedish | 99-38-1B-01 | 07-00-00-00 Swedish (à land Islands) | 99-38-1B-01 | 07-00-00-00 Swedish (Finland) | 99-38-1B-01 | 07-00-00-00 Swedish (Sweden) | 99-38-1B-01 | 07-00-00-00 Swahili | 99-38-00-00 | 07-00-00-00 Swahili (Congo - Kinshasa) | 99-38-00-00 | 07-00-00-00 Swahili (Kenya) | 99-38-00-00 | 07-00-00-00 Swahili (Tanzania) | 99-38-00-00 | 07-00-00-00 Swahili (Uganda) | 99-38-00-00 | 07-00-00-00 Tamil | 99-38-1B-01 | 07-00-00-00 Tamil (India) | 99-38-1B-01 | 07-00-00-00 Tamil (Sri Lanka) | 99-38-1B-01 | 07-00-00-00 Tamil (Malaysia) | 99-38-1B-01 | 07-00-00-00 Tamil (Singapore) | 99-38-1B-01 | 07-00-00-00 Telugu | 99-38-1B-01 | 07-00-00-00 Telugu (India) | 99-38-1B-01 | 07-00-00-00 Teso | 99-38-00-00 | 07-00-00-00 Teso (Kenya) | 99-38-00-00 | 07-00-00-00 Teso (Uganda) | 99-38-00-00 | 07-00-00-00 Thai | 99-38-1B-01 | 07-00-00-00 Thai (Thailand) | 99-38-1B-01 | 07-00-00-00 Tigrinya | 99-38-00-00 | 07-00-00-00 Tigrinya (Eritrea) | 99-38-00-00 | 07-00-00-00 Tigrinya (Ethiopia) | 99-38-00-00 | 07-00-00-00 Tongan | 99-38-1B-01 | 07-00-00-00 Tongan (Tonga) | 99-38-1B-01 | 07-00-00-00 Turkish | 99-38-1B-01 | 07-00-00-00 Turkish (Cyprus) | 99-38-1B-01 | 07-00-00-00 Turkish (Turkey) | 99-38-1B-01 | 07-00-00-00 Tasawaq | 99-38-00-00 | 07-00-00-00 Tasawaq (Niger) | 99-38-00-00 | 07-00-00-00 Central Atlas Tamazight | 99-38-00-00 | 07-00-00-00 Central Atlas Tamazight (Latin) | 99-38-00-00 | 07-00-00-00 Central Atlas Tamazight (Latin, Morocco) | 99-38-00-00 | 07-00-00-00 Uyghur | 99-38-1B-01 | 07-00-00-00 Uyghur (Arabic) | 99-38-1B-01 | 07-00-00-00 Uyghur (Arabic, China) | 99-38-1B-01 | 07-00-00-00 Ukrainian | 99-38-1B-01 | 07-00-00-00 Ukrainian (Ukraine) | 99-38-1B-01 | 07-00-00-00 Urdu | 99-38-1B-01 | 07-00-00-00 Urdu (India) | 99-38-1B-01 | 07-00-00-00 Urdu (Pakistan) | 99-38-1B-01 | 07-00-00-00 Uzbek | 99-38-00-00 | 07-00-00-00 Uzbek (Arabic) | 99-38-00-00 | 07-00-00-00 Uzbek (Arabic, Afghanistan) | 99-38-00-00 | 07-00-00-00 Uzbek (Cyrillic) | 99-38-00-00 | 07-00-00-00 Uzbek (Cyrillic, Uzbekistan) | 99-38-00-00 | 07-00-00-00 Uzbek (Latin) | 99-38-00-00 | 07-00-00-00 Uzbek (Latin, Uzbekistan) | 99-38-00-00 | 07-00-00-00 Vai | 99-38-00-00 | 07-00-00-00 Vai (Latin) | 99-38-00-00 | 07-00-00-00 Vai (Latin, Liberia) | 99-38-00-00 | 07-00-00-00 Vai (Vai) | 99-38-00-00 | 07-00-00-00 Vai (Vai, Liberia) | 99-38-00-00 | 07-00-00-00 Vietnamese | 99-38-1B-01 | 07-00-00-00 Vietnamese (Vietnam) | 99-38-1B-01 | 07-00-00-00 Vunjo | 99-38-00-00 | 07-00-00-00 Vunjo (Tanzania) | 99-38-00-00 | 07-00-00-00 Walser | 99-38-00-00 | 07-00-00-00 Walser (Switzerland) | 99-38-00-00 | 07-00-00-00 Soga | 99-38-00-00 | 07-00-00-00 Soga (Uganda) | 99-38-00-00 | 07-00-00-00 Yangben | 99-38-00-00 | 07-00-00-00 Yangben (Cameroon) | 99-38-00-00 | 07-00-00-00 Yiddish | 99-38-1B-01 | 07-00-00-00 Yiddish (World) | 99-38-1B-01 | 07-00-00-00 Yoruba | 99-38-1B-01 | 07-00-00-00 Yoruba (Benin) | 99-38-1B-01 | 07-00-00-00 Yoruba (Nigeria) | 99-38-1B-01 | 07-00-00-00 Standard Moroccan Tamazight | 99-38-00-00 | 07-00-00-00 Standard Moroccan Tamazight (Morocco) | 99-38-00-00 | 07-00-00-00 Chinese | 99-38-1B-01 | 07-00-00-00 Chinese (Simplified) | 99-38-1B-01 | 07-00-00-00 Chinese (Simplified, China) | 99-38-1B-01 | 07-00-00-00 Chinese (Simplified, Hong Kong SAR China) | 99-38-1B-01 | 07-00-00-00 Chinese (Simplified, Macau SAR China) | 99-38-1B-01 | 07-00-00-00 Chinese (Simplified, Singapore) | 99-38-1B-01 | 07-00-00-00 Chinese (Traditional) | 99-38-1B-01 | 07-00-00-00 Chinese (Traditional, Hong Kong SAR China) | 99-38-1B-01 | 07-00-00-00 Chinese (Traditional, Macau SAR China) | 99-38-1B-01 | 07-00-00-00 Chinese (Traditional, Taiwan) | 99-38-1B-01 | 07-00-00-00 Zulu | 99-38-00-00 | 07-00-00-00 Zulu (South Africa) | 99-38-00-00 | 07-00-00-00
/* * To build on Debian-based systems: * * $ gcc icu-test.c -licui18n -licuuc -o icu-coll-versions * */ #include <stdio.h> #include <stdlib.h> #include "unicode/ustring.h" #include "unicode/ucol.h" #define DISPLAY_LOCALE "en_US" #define ICU_DISPLAY_LEN 512 char *austrdup(const UChar* unichars); void listLocales(void); char * austrdup(const UChar* unichars) { int length; char *newString; length = u_strlen (unichars); newString = (char*) malloc(sizeof(char) * 4 * (length + 1)); if (!newString) return NULL; u_austrcpy(newString, unichars); return newString; } void listLocales(void) { int32_t available; UErrorCode status = U_ZERO_ERROR; int i; /* Print header */ printf("Collator | ICU Version | UCA Version\n"); printf("-----------------------------------------------------------------------------\n"); available = uloc_countAvailable(); for (i = 0; i < available; i++) { UCollator *collator = NULL; UVersionInfo versionIcu; UVersionInfo versionUca; UChar displayName[512]; const char *locale; int32_t displayLength; /* Get locale*/ locale = uloc_getAvailable(i); /* Open collator from that locale */ collator = ucol_open(locale, &status); if (status > U_ZERO_ERROR) if (U_FAILURE(status)) { printf("error with locale %s for ucol_open: code %d\n", locale, (int) status); ucol_close(collator); status = U_ZERO_ERROR; continue; } /* Get ICU version info for same collator */ ucol_getVersion(collator, versionIcu); /* "Version [argument] is the UCA version number (3.1.1, 4.0)" */ ucol_getUCAVersion(collator, versionUca); displayLength = ucol_getDisplayName(locale, DISPLAY_LOCALE, displayName, ICU_DISPLAY_LEN, &status); if (displayLength > ICU_DISPLAY_LEN) { printf("error with locale %s for ucol_getDisplayName: could not fit %d\n", locale, (int) displayLength); ucol_close(collator); status = U_ZERO_ERROR; continue; } if (U_FAILURE(status)) { printf("error with locale %s for ucol_getDisplayName: code %d\n", locale, (int) status); ucol_close(collator); status = U_ZERO_ERROR; continue; } /* Print locale's collator details */ printf("%-50s| %02X-%02X-%02X-%02X | %02X-%02X-%02X-%02X\n", austrdup(displayName), (unsigned int) versionIcu[0], (unsigned int) versionIcu[1], (unsigned int) versionIcu[2], (unsigned int) versionIcu[3], (unsigned int) versionUca[0], (unsigned int) versionUca[1], (unsigned int) versionUca[2], (unsigned int) versionUca[3]); ucol_close(collator); } } int main(int argc, char **argv) { UErrorCode status; listLocales(); return 0; }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers