ubuntuusers.de

Umlaute und ß mit NCurses und C/C++

Status: Gelöst | Ubuntu-Version: Lubuntu 14.04 (Trusty Tahr)
Antworten |

eagle87

Anmeldungsdatum:
29. Dezember 2010

Beiträge: 85

Hallo zusammen,

ich hab gerade ein Problem mit Umlauten und dem scharfen S bei NCurses. Durch die Umlaute wird die blaue Einfärbung des NCurses-Window am Zeilenende Eingerückt. Außerdem ist der Curser an der falschen Position. Das scharfe S wird nicht richtig angezeigt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <ncurses.h>
#include <locale.h>

WINDOW *win;

int main(void)
{

	initscr();
	win = newwin(LINES-2, COLS-2, 1, 1);
	setlocale(LC_ALL, "de_DE");
	
	start_color();
	init_pair(1, COLOR_RED, COLOR_BLUE);
	wbkgd(win, COLOR_PAIR(1));
	
	mvwaddstr(win, 1, 1, "#äöüß#");
	
	refresh();
	wrefresh(win);
	while(getch()!='q');
	delwin(win);
	endwin();
	return 0;
}

Was muss verändert werden, dass diese Fehler nicht mehr auftreten?

Viele Grüße
Michael

Bilder

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6507

Wohnort: Hamburg

Ich hatte vor Jahren mal versucht, mich in NCurses einzuarbeiten. Ich meine mich dunkel zu erinnern, das es dort auch spezielle Funktionen für wide-strings und multibyte-strings gibt (erkennbar am 'w' bzw. 'mb' im namen).

Schau doch mal, ob Du so etwas findest.

eagle87

(Themenstarter)

Anmeldungsdatum:
29. Dezember 2010

Beiträge: 85

Zu multibyte-strings unter NCurses habe ich nichts gefunden, aber die Funktionen zu den wide-strings sind im Packet libncursesw5-dev enthalten. Mit diesen Funktionen gehts. Danke für den Tipp. Um die wide-string Funktionen zu nutzen muss dem Linker die Option -lncursesw anstatt -lncurses übergeben werden. Außerdem ist das in der man-page zu den wide-string Funktionen angegebene Include falsch. Hier muss <ncursesw/curses.h> angegeben werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdlib.h>
#include <string.h>
#include <ncursesw/curses.h>
#include <locale.h>

WINDOW *win;

int main(void)
{
	setlocale(LC_ALL, "");
	char s[] = "#äöüß#";
	size_t n = strlen(s)+1;
	wchar_t *ws = new wchar_t[n];
	mbstowcs(ws, s, n);
	
	initscr();
	win = newwin(LINES-2, COLS-2, 1, 1);
	
	start_color();
	init_pair(1, COLOR_RED, COLOR_BLUE);
	wbkgd(win, COLOR_PAIR(1));
	
	mvwaddwstr(win, 1, 1, ws);
	
	refresh();
	wrefresh(win);
	while(getch()!='q');
	delete ws;
	delwin(win);
	endwin();
	return 0;
}
Antworten |