]> granicus.if.org Git - icu/commitdiff
ICU-20276 Accept empty strings in Locale::setUnicodeKeywordValue().
authorFredrik Roubert <roubert@google.com>
Mon, 19 Nov 2018 14:12:05 +0000 (15:12 +0100)
committerFredrik Roubert <fredrik@roubert.name>
Tue, 20 Nov 2018 18:24:33 +0000 (19:24 +0100)
The API documentation is perfectly clear about this, an empty string for
the value means that the keyword should be removed:

  @param keywordValue value of the keyword to be set. If 0-length or
   NULL, will result in the keyword being removed. No error is given if
   that keyword does not exist.

icu4c/source/common/locid.cpp
icu4c/source/test/intltest/loctest.cpp

index 6d38e4668bf515e8b132895278e29c31b5074c59..72224c2f982ac36dfac5b2c33d50e0c1df0fdbf3 100644 (file)
@@ -1448,12 +1448,16 @@ Locale::setUnicodeKeywordValue(StringPiece keywordName,
         return;
     }
 
-    const char* legacy_value =
-        uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data());
+    const char* legacy_value = nullptr;
 
-    if (legacy_value == nullptr) {
-        status = U_ILLEGAL_ARGUMENT_ERROR;
-        return;
+    if (!keywordValue_nul.isEmpty()) {
+        legacy_value =
+            uloc_toLegacyType(keywordName_nul.data(), keywordValue_nul.data());
+
+        if (legacy_value == nullptr) {
+            status = U_ILLEGAL_ARGUMENT_ERROR;
+            return;
+        }
     }
 
     setKeywordValue(legacy_key, legacy_value, status);
index 08b3c6af020ae9a97d52940356db41f96c9f2b03..11240de213a9b6761e8fa0ae8564c342a370009e 100644 (file)
@@ -1969,6 +1969,26 @@ LocaleTest::TestSetUnicodeKeywordValueStringPiece(void) {
 
     static const char expected[] = "de@calendar=buddhist;collation=phonebook";
     assertEquals("", expected, l.getName());
+
+    l.setUnicodeKeywordValue("cu", nullptr, status);
+    status.errIfFailureAndReset();
+    assertEquals("", expected, l.getName());
+
+    l.setUnicodeKeywordValue("!!", nullptr, status);
+    assertEquals("status", U_ILLEGAL_ARGUMENT_ERROR, status.reset());
+    assertEquals("", expected, l.getName());
+
+    l.setUnicodeKeywordValue("co", "!!", status);
+    assertEquals("status", U_ILLEGAL_ARGUMENT_ERROR, status.reset());
+    assertEquals("", expected, l.getName());
+
+    l.setUnicodeKeywordValue("co", nullptr, status);
+    status.errIfFailureAndReset();
+
+    l.setUnicodeKeywordValue("ca", "", status);
+    status.errIfFailureAndReset();
+
+    assertEquals("", Locale::getGerman().getName(), l.getName());
 }
 
 void