我正在尝试将字符串转换为JNI中的JString,但是当字符串包含UTF 8特殊字符时,它似乎没有以正确的方式保存。
例如:“Avda。 Espaᡬ1“应该是”Avda。 España1“。
这是我的代码:
jstr= env->NewStringUTF(str.c_str());
有没有办法转换为指定UTF 8字符集的JString?
答案 0 :(得分:2)
我从某处复制了这些,添加了异常处理。他们在生产中工作。
// jstring to std::wstring
std::wstring jstr2wsz(JNIEnv *env, jstring string)
{
std::wstring wStr;
if (string == NULL)
{
return wStr; // empty string
}
try
{
const jchar *raw = env->GetStringChars(string, NULL);
if (raw != NULL)
{
jsize len = env->GetStringLength(string);
wStr.assign(raw, raw + len);
env->ReleaseStringChars(string, raw);
}
}
catch (const std::exception ex)
{
std::cout << "EXCEPTION in jstr2wsz translating string input " << string << std::endl;
std::cout << "exception: " << ex.what() << std::endl;
}
return wStr;
}
// std::wstring to jstring
jstring wsz2jstr(JNIEnv *env, std::wstring cstr)
{
jstring result = nullptr;
try
{
int len = cstr.size();
jchar* raw = new jchar[len];
memcpy(raw, cstr.c_str(), len * sizeof(wchar_t));
result = env->NewString(raw, len);
delete[] raw;
return result;
}
catch (const std::exception ex)
{
std::wcout << L"EXCEPTION in wsz2jstr translating string input " << cstr << std::endl;
std::cout << "exception: " << ex.what() << std::endl;
}
return result;
}