blob: e86187b0ed3b21699089a3e70d29bf0014d1a31a [file] [log] [blame]
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) {