diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index 1e40478ee8..83c08ec547 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -80,27 +80,27 @@ static bool NotAllNULs(const char *p, size_t n) static size_t encode_utf16(wxUint32 input, wxUint16 *output) { - if (input <= 0xffff) + if (wxUniChar::IsBMP(input)) { if (output) *output = (wxUint16) input; return 1; } - else if (input >= 0x110000) - { - return wxCONV_FAILED; - } - else + else if (wxUniChar::IsSupplementary(input)) { if (output) { - *output++ = (wxUint16) ((input >> 10) + 0xd7c0); - *output = (wxUint16) ((input & 0x3ff) + 0xdc00); + *output++ = wxUniChar::HighSurrogate(input); + *output = wxUniChar::LowSurrogate(input); } return 2; } + else + { + return wxCONV_FAILED; + } } static size_t decode_utf16(const wxUint16* input, wxUint32& output) diff --git a/src/common/ustring.cpp b/src/common/ustring.cpp index ab70ce5ae2..87d5158234 100644 --- a/src/common/ustring.cpp +++ b/src/common/ustring.cpp @@ -502,7 +502,7 @@ wxScopedU16CharBuffer wxUString::utf16_str() const // TODO: error range checks - if (code < 0x10000) + if (wxUniChar::IsBMP(code)) utf16_length++; else utf16_length += 2; @@ -520,15 +520,15 @@ wxScopedU16CharBuffer wxUString::utf16_str() const // TODO: error range checks - if (code < 0x10000) + if (wxUniChar::IsBMP(code)) { out[0] = code; out++; } else { - out[0] = (code - 0x10000) / 0x400 + 0xd800; - out[1] = (code - 0x10000) % 0x400 + 0xdc00; + out[0] = wxUniChar::HighSurrogate(code); + out[1] = wxUniChar::LowSurrogate(code); out += 2; } }