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

Reply via email to