static jstring ICU_languageTagForLocale(JNIEnv* env, jclass, jstring javaLocaleId) { ScopedUtfChars localeID(env, javaLocaleId); // In most common cases, the BCP 47 tag will be the same size as the ICU // locale ID const size_t initialBufferSize = localeID.size() + 1; std::vector<char> buffer(initialBufferSize); UErrorCode status = U_ZERO_ERROR; const size_t outputLength = uloc_toLanguageTag(localeID.c_str(), &buffer[0], buffer.size(), false /* strict */, &status); if (status == U_BUFFER_OVERFLOW_ERROR) { buffer.resize(outputLength + 1); status = U_ZERO_ERROR; uloc_toLanguageTag(localeID.c_str(), &buffer[0], buffer.size(), false /* strict */, &status); } if (status == U_STRING_NOT_TERMINATED_WARNING) { buffer.resize(buffer.size() + 1); buffer[buffer.size() -1] = '\0'; } if (maybeThrowIcuException(env, "ICU::languageTagForLocale", status)) { return NULL; } return env->NewStringUTF(&buffer[0]); }
static jstring ICU_addLikelySubtags(JNIEnv* env, jclass, jstring javaLocaleName) { UErrorCode status = U_ZERO_ERROR; ScopedUtfChars localeID(env, javaLocaleName); char maximizedLocaleID[ULOC_FULLNAME_CAPACITY]; uloc_addLikelySubtags(localeID.c_str(), maximizedLocaleID, sizeof(maximizedLocaleID), &status); if (U_FAILURE(status)) { return javaLocaleName; } return env->NewStringUTF(maximizedLocaleID); }
extern "C" jstring Java_libcore_icu_ICU_getScript(JNIEnv* env, jclass, jstring javaLocale) { UErrorCode status = U_ZERO_ERROR; ScopedUtfChars localeID(env, javaLocale); char script[ULOC_SCRIPT_CAPACITY]; uloc_getScript(localeID.c_str(), script, sizeof(script), &status); if (U_FAILURE(status)) { return NULL; } return env->NewStringUTF(script); }