0

我正在阅读网络上的一些文本,其中一些可能包含外语字符......通过 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 层,它返回 aconst char *然后我将它传递到这里。它可以工作,但没有正确转换为 unicode。

----更新---- 这是基于汉斯建议的工作新代码:

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;
4

1 回答 1

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;
    }
于 2012-08-31T23:53:51.977 回答