java — Android ndk log Юникод (широкие символы)

Я пытаюсь записать в юникод-символы logcat (UTF16; широкие символы, такие как японский, корейский или китайский). Единственный успех — это обходной путь, который заключается в отправке его на Java в виде строки (например, код ниже):

unsigned short* text = new unsigned short[100];      // or jchar*
.... // all some unicode to the array
jstring jtext = jniEnv->NewString(text, (jsize)length);
jniEnv->CallVoidMethod( JavaClass, JavaPrintUnicode, jtext );
... // Clean up

// Then java prints it out

Однако, если байты находятся в массиве символов, __android_log_print напечатает искаженный текст. Есть ли способ распечатать текст на стороне NDK (C ++)?

1

Решение

Android NDK, как типично для Linux, использует 32-битные символы для представления широких символов, поэтому, если преобразование в UTF-32 тривиально, вы можете попробовать это:

unsigned short text[100];
// fill text with UTF-16; make sure that all characters are 2 bytes long
long utf32[100];
for (int i=0; i<100; i++)
utf32[i] = text[i];

__android_log_print(ANDROID_LOG_INFO, "UTF-32", "%ls", utf32);
3

Другие решения

Вместо этого вы можете напечатать шестнадцатеричные значения для каждого символа.

void print_string_as_hex(WCHAR* ws){
int l = wcslen(ws);
for(int i = 0 ; i < l ; i++)
__android_log_print(ANDROID_LOG_INFO, "MyTag", "%x", ws[i]);
}

Чтобы получить закодированный символ из шестнадцатеричных значений, вы можете использовать Microsoft Word — 4513[Alt-x] будет кодировать 0x4513для тебя.

0

По вопросам рекламы [email protected]