Problem mit Ncursesw und Widechars

mccae

Senfdazugeber
Hallo,

Ich hätte da ein Problem NCursesW und Widecharacters betreffend.

Ich muss nämlich ein Projekt internationalisieren und bin auf ein großes Problem gestoßen.
Bevor ich richtig loslege, wollte ich einen kleinen Test ausführen.

Der Code lautet wie folgt (erklärung unten):

C:
#define _XOPEN_SOURCE_EXTENDED

#include "cursesl.h"
#include <ncursesw/curses.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>

void doPainting() {
	move(0,0);
	refresh();
}

JNIEXPORT void JNICALL Java_at_co_lipski_projectmarcello_Curses_test (JNIEnv * env, jclass class){
	setlocale(LC_ALL, "");

	initscr ();	
	keypad (stdscr, TRUE);
	cbreak ();
	noecho ();
	
	clear();
	doPainting();
	
	move(0,0);
	
	wint_t c = 0xC3B6;
	wint_t c2 = 'a';
	
	cchar_t ccharToAdd;
	setcchar(&ccharToAdd, (wchar_t *) &c, 0, 0, NULL);

	add_wch(&ccharToAdd);
	
	
	cchar_t ccharToAdd2;
	setcchar(&ccharToAdd2, (wchar_t *) &c2, 0, 0, NULL);

	add_wch(&ccharToAdd2);
	
	doPainting();
	endwin();
}

Dieser Programmabschnitt soll NCursesW initialisieren, das Fenster clearen und folgende Zeichenfolge ausgeben: "Öa".

Das Problem ist, dass das Unicode-Zeichen Ö dennoch nicht ausgegeben wird.
Stattdessen gibt es einen Platzhalter.

Dies kann ich mir jedoch nicht erklären, da mein System ja komplett auf UTF-8 läuft.
Testsysteme:

Debian 6 mit de_DE.UTF-8 locale und Xfce
console1.jpg

Debian 6 mit de_DE.UTF-8 locale und keiner GUI.
console2.jpg

Wie man sieht wird das Zeichen nicht korrekt angezeigt, obwohl das ganze System bereits auf Unicode läuft (samt Terminal).

Bis jetzt habe ich immer die Curses Methoden addch() benutzt um Zeichen hinzuzufügen.
Das hat beim ISO-8859-1 Encoding super geklappt mit den Sonderzeichen, doch das selbe Programm gibt natürlich nur Garbage unter Unicodesystemen aus.
Auch das Einlesen von Sonderzeichen klappt unter Unicodesystemen nicht mehr.

Deshalb musste ich mir etwas überlegen.
NcursesW und die ganzen Widecharactermethoden schienen genau das richtige zu sein.
Trotzdem klappt die Ausgabe überhaupt nicht.
Andere Cursesprogramme schaffen die Ausgabe mit NCursesW unter Unicode-Systemen auch irgendwie, doch wie?

Kann mir da jemand helfen?

Kompiliert wurde das ganze (als DLL) mit diesem Command unter Linux:
Code:
gcc -Wall -std=c99 -shared -m32 -fPIC -I/usr/lib/jvm/java-6-openjdk/include -I$/usr/lib/jvm/java-6-openjdk/include/java -o widecurses.so -lncursesw WideCurses.c

edit:
Sehr, sehr merkwürdig:
Ich habe dieses Testprogramm umgeschrieben und den wchar, welcher Ö sein soll mit einer Einleseoperation belegt.

C:
get_wch(&c);

Dies sorgt dafür, dass ein eingelesenes Zeichen ausgegeben wird.
Und ratet mal was passiert, wenn ich auf meiner Tastatur ein Ö eingebe: Es wird ein korrektes Ö ausgegeben. Total unverständlich.
Wird denn etwa kein Unicode für die Darstellung verwendet?
Denn ich bin auf die Ausgabe von UTF-16 chars aus externer Quelle (Java) angewiesen.
 
Zuletzt bearbeitet:
Hi.

Da gibt es anscheinend ein Missverständnis. Du versuchst da ein UTF-8 "Zeichen" zu verwenden, was kaum möglich ist, da UTF-8 kein widechar Encoding ist, sondern ein Multibyte-Encoding.

Das "normale" Ö ist bei Unicode 0x00D6.

Das Zeichen 0xC3B6 ist irgendetwas ganz wildes (das hier: ?) und offenbar nicht in deinem verwendeten Font enthalten.

Gruß
 
Huhu.

Ouch, da hätte ich auch drauf kommen müssen.
Ich habe statt der Pagenumber die hexadezimale Repräsentation herangenommen.

Der Spaß funktioniert jetzt einwandfrei - auch die Zusammenarbeit mit Java.

Danke,
 
Zurück