bool ustring_from_char(icu::UnicodeString& ret, const String& str, UErrorCode &error) { int32_t capacity = str.size() + 1; UChar *utf16 = ret.getBuffer(capacity); int32_t utf16_len = 0; error = U_ZERO_ERROR; u_strFromUTF8WithSub(utf16, ret.getCapacity(), &utf16_len, str.c_str(), str.size(), U_SENTINEL /* no substitution */, nullptr, &error); ret.releaseBuffer(utf16_len); if (U_FAILURE(error)) { ret.setToBogus(); return false; } return true; }
static int toIDNA2003(const UStringPrepProfile *prep, UChar32 c, icu::UnicodeString &destString) { UChar src[2]; int32_t srcLength=0; U16_APPEND_UNSAFE(src, srcLength, c); UChar *dest; int32_t destLength; dest=destString.getBuffer(32); if(dest==NULL) { return FALSE; } UErrorCode errorCode=U_ZERO_ERROR; destLength=usprep_prepare(prep, src, srcLength, dest, destString.getCapacity(), USPREP_DEFAULT, NULL, &errorCode); destString.releaseBuffer(destLength); if(errorCode==U_STRINGPREP_PROHIBITED_ERROR) { return -1; } else { // Returns FALSE=0 for U_STRINGPREP_UNASSIGNED_ERROR and processing errors, // TRUE=1 if c is valid or mapped. return U_SUCCESS(errorCode); } }