Ich arbeite mich in ncurses ein und habe ein Problem mit
der Ausgabe von grossbuchstabigen Umlauten und Sonderzeichen.
Die _kleinbuchstabigen_ funktionieren alle. Meine Googelei hat noch
kein Ergebnis gebracht (kann an mir liegen, aber "Zeit" habe ich mir
viel genommen).
Ich habe schon in der alt.os.linux.slackware nachgefragt, dann
weitergesucht, und in dieser newsgroup hier gibt es einen Thread vom
Januar 2007 mit dem Titel "ncurses und tastatur". Ehrlich gestanden
bräuchte ich zu diesem Thread vermutlich Verständnishilfe.
Jedenfalls scheint es darauf hinauszulaufen, dass setlocale(3)
explizit gesetzt wird. Genau das habe ich aber gemacht. Ob ich
"de_DE" oder "C" setze, macht in der Ausgabe keinen Unterschied.
Dies ist ein slackware 13.1, $LANG ist de_DE.UTF-8,
ncurses ist kompiliert mit --enable-widec, $TERM ist linux.
Hier ist der Quelltext:
/* * * * * * * * * *
* ncurses-utf.c :
* * * * * * * * * */
#include <ncurses.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "de_DE");
initscr();
raw();
addstr("working: äöü \n");
addstr("NOT WORKING ÄÖÜ ß \n");
addstr("working ñ à ô ó ë ï ¡ ¿ \n");
addstr("NOT WORKING Ñ À Ô Ó Ë Ï \n");
refresh();
getch();
endwin();
return 0;
}
Die Ausgabe unterscheidet sich nur kaum je nach Terminal,
/usr/bin/xterm zeigt nichts, /usr/bin/terminal und die tty außerhalb
X zeigen es wie unten. Die Kleinbuchstaben werden
gut gezeigt, die Großbuchstaben als Doppelzeichen, also so:
working: äöü
NOT WORKING �~D�~V�~\ �~_
working ñ à ô ó ë ï ¡ ¿
NOT WORKING �~Q �~@ �~T �~S �~K �~O
----------------
Ich wäre schon dankbar für einen Fingerzeig, in welche Richtung ich weiter
suchen kann. Terminfo? $TERM?
Gruß, Erich
Wirklich,
gewöhn Dich an de_DE.UTF-8, sowohl in Deinem Code, als auch in Deinem
Terminal.
Viele Grüsse,
VB.
--
Bitte beachten Sie auch die Rückseite dieses Schreibens!
so hat es bei mir funktioniert!
aber nur bei der verwendung eines utf8 terminals
und wenn die strings in utf8 geschrieben sind!
auf einem latin9 terminal läuft der code nur mit änderungen
* strings in latin9
* lib -lncurses
mfg
bw1
Dennis, Volker, bw1, herzlichen Dank.
Zunächst einmal war das Entscheidende das Linken gegen ncursesw,
also
gcc -o <output> <input>.c -lncursesw
!
So stand es auch die ganze Zeit in der manpage ncurses unter "routines
and argument names"! Ich hatte die auch "gelesen", und werde wohl
meine Lesemethoden verändern müssen, es ging mir durch die Lappen.
Was setlocale(3) angeht, ist mein setlocale(LC_All, "de_DE") das
Allerfalscheste, ich hatte das unkritisch übernommen.
Es funktioniert mit
setlocale(LC_All, "de_DE.UTF-8")
und/oder
setlocale(LC_All, "")
Mein echo $LANG ist auch "de_DE.UTF-8". Dann werde ich besser dies als
setlocale nehmen. Wenn ich richtig verstehe, dann übernimmt aber
setlocale(LC_ALL, "") die aktuelle locale.
Wunderbar. Dann kann ich jetzt einsteigen.
Dank und Gruß,
erich