如何传递具有拉丁语1的字符串补充从c层到java的字符

时间:2015-02-10 12:40:32

标签: android eclipse utf-8 webvtt ttml

我在传递具有Latin 1补充字符的Webvtt / smptett文件中给出的字符串时遇到问题(2字节范围0080-00FF)。在C中我将它们存储为无符号字符,当我尝试打印字符串时,我得到这些字符的十六进制值。例如:感觉打印为传真

相同的字符串我通过cpp传递给Java层,我使用NewStringUTF来转换字符串中的字符串。 但是我收到了这个错误: - JNI在应用程序中检测到错误:输入无效修改的UTF-8:非法连续字节0x6e。 这个错误特别出现在棒棒糖版本中。 在以前的版本中,此字符在屏幕上显示为一些垃圾值。 已经报告了一个android bug,但他们已经提到以下错误带有4个字节的unicode字符。 有人可以就此提出任何建议。 我真的被这个问题困住了......

1 个答案:

答案 0 :(得分:1)

顾名思义,NewStringUTF不使用Latin1。

您有以下选项:

  • 在C ++代码中将字符串从Latin1转换为UTF-8

  • 交换Latin1编码的byte[]而不是String s并在Java端解码它们

  • 手动将字符串转换为jchar数组并使用NewString

    // the code below sucks and may be wrong
    jchar* tmp = new jchar[LENGTH OF STRING];
    for(size_t i = 0 ; i<LENGTH OF STRING; i++) {
        tmp[i] = (unsigned char) my_string[i];
    }
    NewString(env, tmp, LENGTH OF STRING);
    delete[] tmp;
    
  • 最后,这个解决方案只能在Android上运行,可能不适用于所有版本:只有Android的JNI函数NewStringLatin1,它可以完全按照您的需要运行。

    < / LI>