Как передать строку с латинским 1 дополняет символы из слоя C в Java

Я сталкиваюсь с проблемой при передаче строк, заданных в файле Webvtt / smptett, с латинскими 1 дополняющими символами (диапазон 2 байтов 0080—00FF). В C I я храню их как символы без знака, и когда я пытаюсь напечатать строку, я получаю шестнадцатеричное значение таких символов. например: feelíng печатается как факс

Эту же строку я передаю слою Java через cpp, где я использую NewStringUTF для преобразования строки в строку. Но я получаю эту ошибку:- JNI DETECTED ERROR IN APPLICATION: ввод недействителен. UTF-8 изменен: недопустимый байт продолжения 0x6e. Эта ошибка специально входит в версию леденца на палочке. В предыдущей версии этот символ был напечатан как некоторые ненужные значения на экране. Об этом уже сообщалось как об ошибке Android, но они упоминали, что следующая ошибка идет с 4-байтовыми символами Unicode. Может кто-нибудь, пожалуйста, дать какие-либо предложения по этому поводу. Я действительно застрял с этой проблемой...

1 ответ

Как следует из названия, NewStringUTF не использует Latin1.

У вас есть следующие варианты:

  • конвертировать строки из Latin1 в UTF-8 в вашем коде C++

  • обменять Latin1-закодированный byte[]с вместо 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, и, вероятно, не на всех версиях: есть функция JNI только для Android NewStringLatin1, который делает именно то, что вы хотите.

Другие вопросы по тегам