0

Latin 1 補足文字 (2 バイト範囲 0080 ~ 00FF) を含む Webvtt / smptett ファイルで指定された文字列を渡す際に問題に直面しています。CIではそれらを符号なし文字として保存しています。文字列を印刷しようとすると、そのような文字の16進値を取得しています。例: 気持ちがファックスとして印刷されている

文字列を文字列に変換するためにNewStringUTFを使用しているcppを介してJavaレイヤーに渡しているのと同じ文字列。しかし、私はこのエラーを受け取ります: - JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0x6e. このエラーは、ロリポップ バージョンで特別に発生します。以前のバージョンでは、この文字は画面にジャンク値として出力されていました。Android のバグとして既に報告されていますが、4 バイトの Unicode 文字で次のエラーが発生することが報告されています。誰かがこれに関する提案をしてください。私は本当にこの問題で立ち往生しています...

4

1 に答える 1

1

名前が示すように、NewStringUTFLatin1 は使用しません。

次のオプションがあります。

  • C++ コードで文字列を Latin1 から UTF-8 に変換する

  • byte[]の代わりにLatin1 でエンコードされた を交換Stringし、Java 側でデコードします

  • 文字列をjchars の配列に手動で変換し、次を使用します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 に答える