C++/CLI UTF-8 和 JNI 无法正确转换 Unicode 字符串

标签 c++ c++-cli java-native-interface

我有一个返回 unicode 字符串的 Java 类...Java 具有正确版本的字符串,但是当它以 jstring 的形式通过 JNI 包装器时,它必须转换为 C++ 或 C++/CLI字符串。这是我的一些测试代码,它们实际上适用于除亚洲字符集之外的大多数语言。简体中文和日文字符乱码,我不明白为什么。这是代码片段,我没有发现任何一种转换方法有任何问题(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;
    }

最佳答案

答案是在 Windows XP 中启用东亚语言,因为 Win7 + 更高版本可以正常工作。 super 简单....浪费一整天哈哈。

关于C++/CLI UTF-8 和 JNI 无法正确转换 Unicode 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223778/

相关文章:

C++ 到函数式

c++ - 赋值和添加运算符重载(2 个表和 int 的连接)

c++-cli - 在 C++/CLI 中使用 glut 库时出现错误

c# - 在 C++/CLI 中创建托管类和命名空间时出现问题

namespaces - 在命名空间声明后立即添加 "using namespace"是否可以接受?

c++ - 转发声明或自给自足的标题?

c++ - Visual C++ 2010 将 User32.dll 导入 64 位 win7 时出错

java - JNI 'problematic frame' 导致 JVM 崩溃

android - 完全使用 native 代码(无 JNI)从后台线程更新 UI?

java - 在 JNI 中连接 C++ istream/ostream 和 Java InputStream/OutputStream