3

Unicode 文字列を返す Java クラスがあります... Java には正しいバージョンの文字列がありますが、JNI ラッパーを介して jstring の形式で渡される場合は、C++ または C++/CLI 文字列に変換する必要があります。これは、アジアの文字セットを除くほとんどの言語で実際に機能する、私が持っているテストコードです。中国語の簡体字と日本語の文字化けが発生し、原因がわかりません。ここにコード スニペットがあります。どちらの変換方法にも問題はありません (if ステートメントは、差分 OS を持つ 2 つの VM があり、適切な変換方法を実行するため、os をチェックします)。

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

1 に答える 1

3

答えは、Win7以降が正常に動作するため、Windows XPで東アジア言語を有効にすることでした。とても簡単です....丸一日の無駄です笑。

于 2012-09-06T01:19:45.143 に答える