diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-11 12:11:56 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-11 12:11:56 -0700 |
commit | bcef13b666c7459241235bc6209837ae81884d2f (patch) | |
tree | a1313bb849f73fd1b62d221f60196fe8fd44edf5 /libs/utils/String16.cpp | |
parent | 22f8defddca562244d43611d99ce76c3ae65a73e (diff) | |
download | frameworks_native-bcef13b666c7459241235bc6209837ae81884d2f.zip frameworks_native-bcef13b666c7459241235bc6209837ae81884d2f.tar.gz frameworks_native-bcef13b666c7459241235bc6209837ae81884d2f.tar.bz2 |
auto import from //branches/cupcake/...@137873
Diffstat (limited to 'libs/utils/String16.cpp')
-rw-r--r-- | libs/utils/String16.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/libs/utils/String16.cpp b/libs/utils/String16.cpp index ae0ae1e..aef67f2 100644 --- a/libs/utils/String16.cpp +++ b/libs/utils/String16.cpp @@ -244,7 +244,6 @@ void terminate_string16() // --------------------------------------------------------------------------- -// Note: not dealing with generating surrogate pairs. static char16_t* allocFromUTF8(const char* in, size_t len) { if (len == 0) return getEmptyString(); @@ -255,7 +254,10 @@ static char16_t* allocFromUTF8(const char* in, size_t len) while (p < end) { chars++; - p += utf8_char_len(*p); + int utf8len = utf8_char_len(*p); + uint32_t codepoint = utf8_to_utf32((const uint8_t*)p, utf8len); + if (codepoint > 0xFFFF) chars++; // this will be a surrogate pair in utf16 + p += utf8len; } SharedBuffer* buf = SharedBuffer::alloc((chars+1)*sizeof(char16_t)); @@ -265,7 +267,19 @@ static char16_t* allocFromUTF8(const char* in, size_t len) char16_t* d = str; while (p < end) { size_t len = utf8_char_len(*p); - *d++ = (char16_t)utf8_to_utf32((const uint8_t*)p, len); + uint32_t codepoint = utf8_to_utf32((const uint8_t*)p, len); + + // Convert the UTF32 codepoint to one or more UTF16 codepoints + if (codepoint <= 0xFFFF) { + // Single UTF16 character + *d++ = (char16_t) codepoint; + } else { + // Multiple UTF16 characters with surrogates + codepoint = codepoint - 0x10000; + *d++ = (char16_t) ((codepoint >> 10) + 0xD800); + *d++ = (char16_t) ((codepoint & 0x3FF) + 0xDC00); + } + p += len; } *d = 0; |