Преобразуйте Java utf-8 строка (один символ) к ubuntu x11 Keysym

Я пишу приложение, которое отправляет нажатия клавиш от виртуальной клавиатуры андроида до некоторому клиенту. В настоящее время я реализую клиент Ubuntu, отправляя фальшивку x11 входные события. У меня есть проблема при преобразовании специальных символов UTF-8 или любого нестандартного алфавита (тестирующий использование кириллического) к x11 внутреннему представлению. Функция XStringToKeysym не работает вообще. Все, что это делает правильно, преобразовывает латинские символы.

Я попробовал различную кодировку, но ни один из них не работает полностью.

Последний подход - это:

char *nativeString = ...; //utf-8 encoding
int k = 0;
unsigned long int code = 0;
char c;

while((c = nativeString[k++]) != '\0' ){
    code = code | ((c & 0xFF)  << (k-1)*8);
}

Это добавляет некоторые знаки пунктуации к рабочему списку. То же соглашение с Кириллическим алфавитом все же.

Совет?

Править:

На стороне Java я получаю строку от сокета:

String str = ...; // from socket
System.out.println(str); //prints out good
byte[] bytes = str.getBytes("UTF-8");
NativeCall.press(bytes,...);

На собственной стороне:

JNIEXPORT void JNICALL Java_NativeCall_press(JNIEnv* env, jobject obj, jbyteArray array, jint modifiers) {

Window winFocus;
int    revert;
XGetInputFocus(display, &winFocus, &revert);


jboolean copy;
jbyte* bufferPtr = env->GetByteArrayElements(array, NULL);//got the bytes
jsize lengthOfArray = env->GetArrayLength(array);//length


for(int i = 0;i<lengthOfArray;i++){ //print the byte to make sure they are the same as in java code
    cout << (bufferPtr[i] & 0xff) << endl;
}


KeySym code = XStringToKeysym((const char *) bufferPtr);//doesn't work
cout << "Code: " << code << endl; //way #1

/*unsigned long int code = 0;   //way #2, works with some symbols

for(int i = 0;i<lengthOfArray;i++){
    char c = bufferPtr[i];
    code = code | ((c & 0xFF)  << i*8);
}*/


env->ReleaseByteArrayElements(array, bufferPtr, JNI_ABORT);

//send event, checked, works fine

XKeyEvent event = createKeyEvent(display, winFocus, root_window, true, code, modifiers);
XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

XFlush(display);

event = createKeyEvent(display, winFocus, root_window, false, code, modifiers);
XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);


XFlush(display);

}
0
задан 26 January 2017 в 05:11

0 ответов

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

Похожие вопросы: