我在传递具有Latin 1补充字符的Webvtt / smptett文件中给出的字符串时遇到问题(2字节范围0080-00FF)。在C中我将它们存储为无符号字符,当我尝试打印字符串时,我得到这些字符的十六进制值。例如:感觉打印为传真
相同的字符串我通过cpp传递给Java层,我使用NewStringUTF来转换字符串中的字符串。 但是我收到了这个错误: - JNI在应用程序中检测到错误:输入无效修改的UTF-8:非法连续字节0x6e。 这个错误特别出现在棒棒糖版本中。 在以前的版本中,此字符在屏幕上显示为一些垃圾值。 已经报告了一个android bug,但他们已经提到以下错误带有4个字节的unicode字符。 有人可以就此提出任何建议。 我真的被这个问题困住了......
答案 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
,它可以完全按照您的需要运行。