Hello,
I run NetBSD CURRENT amd64 with pkgsrc, both two months old (I'll reinstall next days).
I notice problems with displaying wide chars with ncursesw.
Attached there is an archive with a short C file which prints a multibyte string ("äöüß") one time with printw(), then with add_wchstr().
printw() prints the umlauts "äüö" but doesn't print "ß". add_wchstr() prints nothing useful. Compiling the same with
make -f ncurses
on any other UNIX works fine.
When I compile the same with curses:
make -f curses
add_wchstr() always works correct. printw() is correct in xterm (TERM=xterm) but prints the raw ASCII characters in tmux(1) (TERM=screen). This may be a curses issue, but since I always use add_wchstr() I have no problem with that.
I set the locale with
export LC_ALL=en_US.UTF-8
and the the locale is
$ locale
LANG=""
LC_CTYPE="en_US.UTF-8"
LC_COLLATE="C"
LC_TIME="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
The contents of the archive is (must be UTF-8 encoded):
$ cat main.c
#define _XOPEN_SOURCE_EXTENDED
#include <locale.h>
#include <stdlib.h>
#ifdef NCURSESW
# include <ncursesw/curses.h>
#else
# include <curses.h>
#endif
int
main()
{
static wchar_t ws[2];
wchar_t wcs[100];
cchar_t ccs[100];
wchar_t *wcp;
cchar_t *ccp;
char *mbs = "äöüß";
setlocale(LC_ALL, "");
initscr();
printw("%s\n", mbs);
mbstowcs(wcs, mbs, sizeof(wcs)/sizeof(*wcs));
wcp = wcs;
ccp = ccs;
do {
*ws = *wcp++;
setcchar(ccp++, ws, 0, 0, NULL);
} while (*ws);
add_wchnstr(ccs, -1);
refresh();
getch();
endwin();
return 0;
}
$ cat ncurses
INCDIR= -I/usr/pkg/include
LIBDIR= -L/usr/pkg/lib
RPATH= -Wl,-rpath,/usr/pkg/lib
LDADD= -lncursesw
main: main.o
$(CC) $(RPATH) $(LIBDIR) -fsanitize=address main.o -o $@ $(LDADD)
clean:
rm -f main.o main
.c.o:
$(CC) -c $(CFLAGS) -DNCURSESW $(INCDIR) -fsanitize=address $<
$ cat curses
LDFLAGS=-lcurses
CFLAGS=-g #-fsanitize=address
all: main
clean:
rm -f main
Attachment:
test.tgz
Description: Binary data