我正在阅读来自网络的一些文本,其中一些可能有外语字符...通过C ++ / CLI读取它并且不想将字符串转换为托管String^
但是似乎遇到了一些麻烦。这是我正在使用的代码片段
String^ NativeToCliString(const char * nString) {
String^ converted; // = gcnew String("");
if (nString != NULL)
{
converted = (gcnew marshal_context())->marshal_as<String^>(nString);
}
return converted;
}
该函数不会抛出错误,但是,当我将代码输出到windows窗体时,它会显示一堆随机(ASCII)字符......
我使用的JNI方法相当简单....如果需要,我也可以发布该代码。本质上,我只是调用Java层,它返回一个const char *
,然后我在这里传递。它可以工作,但只是没有正确转换为unicode。
----更新---- 以下是基于Hans的建议的新代码:
int bufSize = MultiByteToWideChar(CP_UTF8, 0 , raw , -1, NULL , 0 );
wchar_t* wstr = new wchar_t[bufSize];
MultiByteToWideChar( CP_UTF8 , 0 , raw , -1, wstr , bufSize );
String^ val = gcnew String(wstr);
delete[] wstr;
答案 0 :(得分:0)
以下是如何做到的...我使用了if语句,因为我有两个不同操作系统的虚拟机,但两种方式都适用。
String^ JStringToCliString(const jstring string){
String^ converted = gcnew String("");
JNIEnv* envLoc = GetJniEnvHandle();
std::wstring value;
jboolean isCopy;
if(string){
try{
jsize len = env->GetStringLength(string);
if(Environment::OSVersion->Version->Major >= 6) // 6 is post XP/2003
{
TraceLog::Log("Using GetStringChars() for string conversion");
const jchar* raw = envLoc->GetStringChars(string, &isCopy);
// todo add exception handling here for jvm
if (raw != NULL) {
value.assign(raw, raw + len);
converted = gcnew String(value.c_str());
env->ReleaseStringChars(string, raw);
}
}else{
TraceLog::Log("Using GetStringUTFChars() for string conversion.");
const char* raw = envLoc->GetStringUTFChars(string, &isCopy);
if(raw) {
int bufSize = MultiByteToWideChar(CP_UTF8, 0 , raw , -1, NULL , 0 );
wchar_t* wstr = new wchar_t[bufSize];
MultiByteToWideChar( CP_UTF8 , 0 , raw , -1, wstr , bufSize );
String^ val = gcnew String(wstr);
delete[] wstr;
converted = val; // partially working
envLoc->ReleaseStringUTFChars(string, raw);
}
}
}catch(Exception^ ex){
TraceLog::Log(ex->Message);
}
}
return converted;
}