0

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

我通过 cpp 将相同的字符串传递给 Java 层,在其中我使用 NewStringUTF 将字符串转换为字符串。但我收到此错误:- JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: 非法延续字节 0x6e。此错误特别出现在棒棒糖版本中。在以前的版本中,这个字符在屏幕上被打印为一些垃圾值。已经报告了一个 android 错误,但他们提到以下错误与 4 字节 unicode 字符一起出现。有人可以就此提出任何建议。我真的被这个问题困住了......

4

1 回答 1

1

顾名思义,NewStringUTF不使用Latin1。

您有以下选择:

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

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

  • jchar手动将您的字符串转换为 s 数组并使用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,它完全可以满足您的需求。

于 2015-02-10T15:00:35.250 回答