Merge "Cherry-pick: Fix the incompatible type of UChar and char16_t"
diff --git a/cpp/src/sample/chromium/subsetter_impl.cc b/cpp/src/sample/chromium/subsetter_impl.cc
index 707ebdc..fc82ef1 100644
--- a/cpp/src/sample/chromium/subsetter_impl.cc
+++ b/cpp/src/sample/chromium/subsetter_impl.cc
@@ -44,10 +44,18 @@
 
 using namespace sfntly;
 
+/**
+ * std::u16string and icu::UnicodeString can't be used here.
+ * UChar is not always char16_t in some platforms. std::u16string is avoided.
+ * icu::UnicodeString C++ API is also avoided to make it more portable across
+ * platforms due to C++ ABI compatility issue.
+ */
+typedef std::basic_string<UChar> UCharString;
+
 // The bitmap tables must be greater than 16KB to trigger bitmap subsetter.
 static const int BITMAP_SIZE_THRESHOLD = 16384;
 
-void ConstructName(UChar* name_part, std::u16string* name, int32_t name_id) {
+void ConstructName(UChar* name_part, UCharString* name, int32_t name_id) {
   switch (name_id) {
     case NameId::kFullFontName:
       *name = name_part;
@@ -55,7 +63,7 @@
     case NameId::kFontFamilyName:
     case NameId::kPreferredFamily:
     case NameId::kWWSFamilyName: {
-      std::u16string original = *name;
+      UCharString original = *name;
       *name = name_part;
       *name += original;
       break;
@@ -76,11 +84,11 @@
 //
 // Ill-formed input is replaced with U+FFFD.
 // Otherwise, return empty string if other error occurs during the conversion.
-std::u16string ConvertFromUtf8(const char* src) {
+UCharString ConvertFromUtf8(const char* src) {
   int32_t srcLength = strlen(src);
   int32_t destCapacity = srcLength + 1;
   UChar* buffer = new UChar[destCapacity];
-  std::u16string dest;
+  UCharString dest;
   if (buffer == NULL) {
     return dest;
   }
@@ -97,8 +105,8 @@
   return dest;
 }
 
-int32_t CaseCompareUtf16(const std::u16string& str1,
-                         const std::u16string& str2, uint32_t option) {
+int32_t CaseCompareUtf16(const UCharString& str1,
+                         const UCharString& str2, uint32_t option) {
   UErrorCode errorCode = U_ZERO_ERROR;
   return u_strCaseCompare(str1.c_str(), str1.length(), str2.c_str(),
                           str2.length(), option, &errorCode);
@@ -120,14 +128,14 @@
 }
 
 bool HasName(const char* font_name, Font* font) {
-  std::u16string font_string = ConvertFromUtf8(font_name);
+  UCharString font_string = ConvertFromUtf8(font_name);
   if (font_string.empty())
     return false;
-  std::u16string regular_suffix(u" Regular");
-  std::u16string alt_font_string = font_string;
+  UCharString regular_suffix = ConvertFromUtf8("Regular");
+  UCharString alt_font_string = font_string;
   alt_font_string += regular_suffix;
 
-  typedef std::map<int32_t, std::u16string> NameMap;
+  typedef std::map<int32_t, UCharString> NameMap;
   NameMap names;
   NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
   if (name_table == NULL) {