java - ™ 字符未被 GetStringChars() 正确翻译

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

我注意到商标字符 似乎没有被 Java 8 中 JNI 的 GetStringChars() 函数正确翻译,它应该翻译 Unicode 字符。 GetStringUTFChars() 方法也有同样的问题。

这不是什么大问题,因为有简单的解决方法(在调用 JNI 函数之前从字符串中删除 Unicode 字符)。

但是我在谷歌搜索没有发现类似的问题,所以我来这里看看有没有人对此有解释? (或者我的代码中遗漏了什么?)

我在 MinGW 下使用 Java 8 和 g++ 4.8。

这是我的代码片段:

JNIEXPORT void JNICALL Java_MyClass_JNI_myMethod (JNIEnv * env , jobject obj, jstring input_string)
{
    const jchar *inp_string = (*env).GetStringChars(input_string, NULL);
    const jchar *jch_inp_string = inp_string;         
    (*env).ReleaseStringChars(input_string, inp_string);       

    std::cout << jch_inp_string <<'\n';   
}

例如,使用这个函数,如果我输入这个字符串:

Random String™

它输出这个:

Random Stringâ„¢

最佳答案

在深入研究文档后,我找到了一个解决方法,这是因为 java 仅支持修改后的 UTF8,这意味着它足以打印 XML 文档,但不能无错误地打印 latin-1 编码字符。

为此,我从 C++ 调用了 java,并让他将他的 utf8 修改字符转换为符合我需要的编码。 我想知道是否有最简单的方法,但我发现 JNI 本身提供的字符串不完全符合非常常见的标准,这很奇怪。

JNIEXPORT void JNICALL Java_MyClass_JNI_myMethod (JNIEnv * env , jobject obj, jstring input_string){

    //this calls back JNI to reformat the string form java UTF8 modified encoding to something more common
    const jclass stringClass = env->GetObjectClass(input_string);
    const jmethodID getBytes = env->GetMethodID(stringClass, "getBytes", "(Ljava/lang/String;)[B");
    const jstring charsetName = env->NewStringUTF("windows-1252");
    const jbyteArray stringJbytes = (jbyteArray) env->CallObjectMethod(input_string, getBytes, charsetName);
    env->DeleteLocalRef(charsetName);
    const jsize length = env->GetArrayLength(stringJbytes);
    const jbyte* strBytes = env->GetByteArrayElements(stringJbytes, NULL); 


    //this make sure our string is C/C++ compliant with null character
    //but it seems to work well without too
    char* my_string = malloc(length+1);
    memcpy( my_string , strBytes, length);
    my_string [length] = '\0';

    env->ReleaseByteArrayElements(stringJbytes, strBytes , JNI_ABORT); 
    env->DeleteLocalRef(stringJbytes);  

    std::cout << my_string << std::endl;

}

关于java - ™ 字符未被 GetStringChars() 正确翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163819/

相关文章:

java - eclipse java 注释处理提交生成的带有 subclipse 的 java 类到 svn

C++ 从 hBitmap 获取 RGB

C++函数将文本居中到给定大小

linux - linux 中的 unicode 字符在 Windows 中不起作用

python - 从 Python 中的字符串中删除表情符号

java - 如何调整 Canvas 中位图的大小?

java - 访问限制 : The type 'Application' is not API (restriction on required library rt. jar)

java - selenium webdriver 模式对话框 java

c++ - 类在 C++ DLL 的成员函数中返回自身

assembly - Ghidra:自动将字节设置为 Unicode/CString