将std :: string转换为使用windows-1256编码的jstring

时间:2015-03-02 23:47:42

标签: c++ java-native-interface stdstring

我正在使用一个库(libcurl)来请求某个阿拉伯语内容的网页。当我获得字符串响应时,它具有阿拉伯字符,整个响应在WINDOWS-1256中编码。

问题是阿拉伯语字符没有正确显示。

有没有办法将std :: string转换为WINDOWS-1256中编码的jstring?

通过我尝试env->NewStringUTF(str.c_str());并且应用程序崩溃的方式。

1 个答案:

答案 0 :(得分:1)

Java字符串使用UTF-16。除了UTF-8和UTF-16之外,JNI没有charset编码的概念(除非你使用JNI调用直接访问Java的Charset类,但Java只实现了一小部分字符集,Windows-1256是除非底层Java JVM专门实现它,否则不是其中之一。)

JNI的NewStringUTF()函数需要UTF-8输入(而不仅仅是标准的UTF-8,而是Java的特殊modified UTF-8)并返回UTF-16编码的JString

因此,在调用NewStringUTF()之前,您必须首先将原始阿拉伯数据从Windows-1256转换为(已修改)UTF-8。更好的选择是直接将数据转换为UTF-16,然后使用JNI的NewString()函数。但无论哪种方式,您都可以使用libiconvICU4JNI或您选择的任何其他Unicode库来实现自己的实际转换。