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