| diff --git a/source/common/uloc_tag.cpp b/source/common/uloc_tag.cpp |
| index 1c10c481..2b76a927 100644 |
| --- a/source/common/uloc_tag.cpp |
| +++ b/source/common/uloc_tag.cpp |
| @@ -1110,6 +1110,19 @@ _appendRegionToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool stri |
| } |
| } |
| |
| +static void _sortVariants(VariantListEntry* first) { |
| + for (VariantListEntry* var1 = first; var1 != NULL; var1 = var1->next) { |
| + for (VariantListEntry* var2 = var1->next; var2 != NULL; var2 = var2->next) { |
| + // Swap var1->variant and var2->variant. |
| + if (uprv_compareInvCharsAsAscii(var1->variant, var2->variant) > 0) { |
| + const char* temp = var1->variant; |
| + var1->variant = var2->variant; |
| + var2->variant = temp; |
| + } |
| + } |
| + } |
| +} |
| + |
| static void |
| _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool strict, UBool *hadPosix, UErrorCode* status) { |
| char buf[ULOC_FULLNAME_CAPACITY]; |
| @@ -1199,6 +1212,9 @@ _appendVariantsToLanguageTag(const char* localeID, icu::ByteSink& sink, UBool st |
| if (varFirst != NULL) { |
| int32_t varLen; |
| |
| + /* per UTS35, we should sort the variants */ |
| + _sortVariants(varFirst); |
| + |
| /* write out validated/normalized variants to the target */ |
| var = varFirst; |
| while (var != NULL) { |
| @@ -2822,6 +2838,7 @@ ulocimp_forLanguageTag(const char* langtag, |
| } |
| |
| /* variants */ |
| + _sortVariants(lt.getAlias()->variants); |
| n = ultag_getVariantsSize(lt.getAlias()); |
| if (n > 0) { |
| if (noRegion) { |