使用JNI从C++发送UTF字符到Java

4

我希望能够从C语言发送包含韩文符号(使用UTF编码)的文本到JAVA。但是JAVA接收到的结果是错误的。 例如:

JNIEXPORT jstring JNICALL Java_get_1term
  (JNIEnv *env, jobject, jint termInd)
{
    const char *str = "음뮤원음직음원샘";
    return (env)->NewStringUTF(str);
}

但在这种情况下,JAVA得到了错误的字符串。

我在其他帖子中找不到答案,如果有相同的问题,请给我链接。


Java不是使用UTF-16BE吗?而你的C源代码具有完全依赖于平台的行为。 - Kerrek SB
在内部,Java char 或 JNI jchar 是无符号的 16 位类型。但是 NewStringUTF 需要一个 UTF8 字符指针。所以这应该可以工作。 - mkaes
1个回答

1

尝试使用这个(从此处获取并调整):

jstring WindowsToJstring(JNIEnv* pEnv, char* cstr) {
   jstring retJstring = NULL;
   int slen = strlen(cstr);
   int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)cstr, slen, NULL, 0 );
   unsigned short* tempbuffer = (unsigned short *)malloc( length*2 + 1 );
   MultiByteToWideChar( CP_ACP, 0, (LPCSTR)cstr, slen, (LPWSTR)tempbuffer, length );
   retJstring = (pEnv)->NewString((jchar*)tempbuffer, length );
   free( tempbuffer );
   return retJstring;
}

编辑 正如 @Kerrek SB 正确指出的那样,这是一个仅适用于Windows的解决方案


谁说OP正在Windows上工作?(尽管我承认,当限制仅在Windows上运行时,Java非常平台无关 :-).) - Kerrek SB
有任何想法如何在Unix平台上实现这个? - Emmanuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接