int32_t toUChar32(UnicodeString& u, UChar32 *c, UErrorCode& status) { #if U_ICU_VERSION_HEX >= 0x04020000 return u.toUTF32(c, 1, status); #else int32_t len = u.length(); if (len >= 1) *c = u.char32At(0); return len; #endif }
wxString ICUStrToWx(const UnicodeString& us) { int32_t cap = us.length() + 1; boost::scoped_array<wchar_t> wbuff(new wchar_t[cap]); UErrorCode errcode = U_ZERO_ERROR; #ifdef __WXMSW__ int32_t len = us.extract(wbuff.get(), cap, errcode); #else int32_t len = us.toUTF32((UChar32 *)wbuff.get(), cap, errcode); #endif if(errcode == U_ZERO_ERROR) return wxString((wxChar*)wbuff.get(), len); return wxString(); }
int decompose(const char* text, wchar_t* wcs_buf, uint buf_size) { // UTF-8 to UCS4 auto str = UnicodeString::fromUTF8(StringPiece(text)); // UCS4 to NFD auto status = U_ZERO_ERROR; UnicodeString result; Normalizer::normalize(str, UNORM_NFD, 0, result, status); if (U_FAILURE(status)) { cerr << "can't decompose a UTF8 string, " << status << ": " << u_errorName(status) << endl; return -1; } result.toUTF32((UChar32*) wcs_buf, buf_size, status); return 0; }