Curses 库在 OS X high sierra 上不支持 wide char
Curses library doesn't support wide char on OS X high sierra
OS X 10.13.2(高山脉)。
我正在尝试编写支持 widechar 的简单 curses 程序,但似乎默认(pre-installed 库)curses 不支持 widechar:
最简单的程序示例(来自here):
#include <ncursesw/ncurses.h>
#include <locale.h>
#include <wchar.h>
int main() {
setlocale(LC_ALL, "");
initscr();
wchar_t wstr[] = { 9474, L'[=11=]' };
mvaddwstr(0, 0, wstr);
refresh();
getch();
endwin();
return 0;
}
不编译,报错:
test.cpp:1:10: fatal error: 'ncursesw/ncurses.h' file not found
试图在手册页中找到:
man addwstr
says:
#include <curses.h>
int addwstr(const wchar_t *wstr);
int addnwstr(const wchar_t *wstr, int n);
int waddwstr(WINDOW *win, const wchar_t *wstr);
int waddnwstr(WINDOW *win, const wchar_t *wstr, int n);
int mvaddwstr(int y, int x, const wchar_t *wstr);
int mvaddnwstr(int y, int x, const wchar_t *wstr, int n);
int mvwaddwstr(WINDOW *win, int y, int x, const wchar_t *wstr);
int mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n);
如手册页所述,尝试包含 "curses.h" 而不是 "ncursesw/ncurses.h"。再次编译错误:
test.cpp:9:5: error: use of undeclared identifier 'mvaddwstr'; did you mean 'mvaddstr'?
试图在 /usr/include 中找到任何 widechar-related 诅咒 header。没有结果。有什么建议吗?
如果您使用如下命令,第二个示例(使用 <curses.h>
)将适用于 MacOS:
gcc -o foo -D_XOPEN_SOURCE_EXTENDED foo.c -lncurses
即:
- 你必须打开一个定义来使宽字符特征可见(你可以通过阅读头文件看到),并且
- 库名称是"ncurses"(尽管它包含宽字符函数)。
做
nm /usr/lib/libncurses.dylib | grep addwstr
看到这个:
0000000000024c39 T _addwstr
0000000000024fba T _mvaddwstr
00000000000254ad T _mvwaddwstr
000000000002580c T _waddwstr
截至 2018 年年中,MacOS bundles 只有一个非常旧的 ncurses 库(5.7,在 2008 中发布) ,以及相应的旧终端数据库。你可以通过
看到
$ /usr/bin/tic -V
ncurses 5.7.20081102
有趣的是,动态库的文件名暗示它确实是 ncurses 5.4(又早了 4 年),但是 tic
和curses.h
头文件告诉实际版本。如前所述,该库包含宽字符库所需的符号。大多数系统使用的 ncurses 和 ncursesw 库之间的名称区别早于 ncurses 5.4(再次)几年,因此 Apple 的配置会让大多数开发人员感到困惑。
对于开发,您应该考虑使用更新的东西,例如MacPorts or homebrew。对于那些,配置细节很容易获得,并且(不出所料)提供 ncursesw 库。
OS X 10.13.2(高山脉)。
我正在尝试编写支持 widechar 的简单 curses 程序,但似乎默认(pre-installed 库)curses 不支持 widechar:
最简单的程序示例(来自here):
#include <ncursesw/ncurses.h>
#include <locale.h>
#include <wchar.h>
int main() {
setlocale(LC_ALL, "");
initscr();
wchar_t wstr[] = { 9474, L'[=11=]' };
mvaddwstr(0, 0, wstr);
refresh();
getch();
endwin();
return 0;
}
不编译,报错:
test.cpp:1:10: fatal error: 'ncursesw/ncurses.h' file not found
试图在手册页中找到:
man addwstr says:
#include <curses.h>
int addwstr(const wchar_t *wstr);
int addnwstr(const wchar_t *wstr, int n);
int waddwstr(WINDOW *win, const wchar_t *wstr);
int waddnwstr(WINDOW *win, const wchar_t *wstr, int n);
int mvaddwstr(int y, int x, const wchar_t *wstr);
int mvaddnwstr(int y, int x, const wchar_t *wstr, int n);
int mvwaddwstr(WINDOW *win, int y, int x, const wchar_t *wstr);
int mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n);
如手册页所述,尝试包含 "curses.h" 而不是 "ncursesw/ncurses.h"。再次编译错误:
test.cpp:9:5: error: use of undeclared identifier 'mvaddwstr'; did you mean 'mvaddstr'?
试图在 /usr/include 中找到任何 widechar-related 诅咒 header。没有结果。有什么建议吗?
如果您使用如下命令,第二个示例(使用 <curses.h>
)将适用于 MacOS:
gcc -o foo -D_XOPEN_SOURCE_EXTENDED foo.c -lncurses
即:
- 你必须打开一个定义来使宽字符特征可见(你可以通过阅读头文件看到),并且
- 库名称是"ncurses"(尽管它包含宽字符函数)。
做
nm /usr/lib/libncurses.dylib | grep addwstr
看到这个:
0000000000024c39 T _addwstr
0000000000024fba T _mvaddwstr
00000000000254ad T _mvwaddwstr
000000000002580c T _waddwstr
截至 2018 年年中,MacOS bundles 只有一个非常旧的 ncurses 库(5.7,在 2008 中发布) ,以及相应的旧终端数据库。你可以通过
看到$ /usr/bin/tic -V
ncurses 5.7.20081102
有趣的是,动态库的文件名暗示它确实是 ncurses 5.4(又早了 4 年),但是 tic
和curses.h
头文件告诉实际版本。如前所述,该库包含宽字符库所需的符号。大多数系统使用的 ncurses 和 ncursesw 库之间的名称区别早于 ncurses 5.4(再次)几年,因此 Apple 的配置会让大多数开发人员感到困惑。
对于开发,您应该考虑使用更新的东西,例如MacPorts or homebrew。对于那些,配置细节很容易获得,并且(不出所料)提供 ncursesw 库。