ncurses的UTF-8支持
Tuesday, 8. August 2006, 13:28:58
ncurses默认是不支持UTF-8的,不过作为一个中国人,我们用中文的时候还是比用英文的多的多。所以在编程的时候要考虑对中文的兼容问题(当然英语国家的人写程序的时候也应该想一下其他地方的人,这也是好多西方人容易忽略的地方)。下面就来说一下怎么在ncurses里面支持UTF-8编码的字符。
首先,要在程序的开始调用setlocale函数来设置locale,如果使用系统默认的locale,就这样
具体可以参见 setlocale(3)
对于UTF-8的字符和字符串,就可以像使用普通的字符和字符串那样使用了,不过对于strlen,要用wcslen()来代替(好像如果想要看一下一个字符串要占用多少列的空间,也要用wcswidth(),不过我不确定,我作了几次实验反回的都是-1,希望知道的朋友留个言讲一下,谢谢了)。
然后在编译时也要注意,不要用gcc a.c -lncurses,而要用gcc a.c -lncursesw,ncursesw是ncurses支持宽字符(wide character)的版本。这样整个程序就可以使用UTF-8编码的任意字符了。
ps:在网上查了半天发现这方面的资料真的好少,最后在一个关于aspell的贴子里面找到了结果。
首先,要在程序的开始调用setlocale函数来设置locale,如果使用系统默认的locale,就这样
setlocale(LC_ALL,"");
具体可以参见 setlocale(3)
man 3 setlocale
对于UTF-8的字符和字符串,就可以像使用普通的字符和字符串那样使用了,不过对于strlen,要用wcslen()来代替(好像如果想要看一下一个字符串要占用多少列的空间,也要用wcswidth(),不过我不确定,我作了几次实验反回的都是-1,希望知道的朋友留个言讲一下,谢谢了)。
然后在编译时也要注意,不要用gcc a.c -lncurses,而要用gcc a.c -lncursesw,ncursesw是ncurses支持宽字符(wide character)的版本。这样整个程序就可以使用UTF-8编码的任意字符了。
ps:在网上查了半天发现这方面的资料真的好少,最后在一个关于aspell的贴子里面找到了结果。














Anonymous # 11. February 2007, 06:02
aaaa
Chen Yufei # 21. February 2007, 14:38
mbstowcs 的返回值是用“系统编码”的 char 数组中含有的字符的个数,系统编码由 LC_CTYPE 决定。举例来说,如果 LC_CTYPE 是 UTF-8, 那么 mbstowcs 认为传给它的 const char* 数组中的字节流是 UTF-8 编码的,它将把 UTF-8 编码的字节流转换为 wchar_t 数组,并返回字节流中字符的个数(对 32 bit 的 wchar_t 的话应该就是一个字符对应一个 wchat_t 了,不过我不知道 C 标准有没有指定 wchar_t 一定要实现为 32 bit)
所以如果想要知道 UTF-8 编码的字符数组中有多少个字符的话应该使用 mbstowcs。当然也可以使用其他的库,比如 glib 中就有处理 unicode 的函数。
不知道有没有讲清楚。谢谢你的两篇关于 ncurses 的文章,帮到我不少忙了!大一就已经接触这样的东西真是厉害啊,我都已经大三了才开始这些东西,真是惭愧。
ncurses 的国际化的资料是不多,不过实际上它对国际化的支持已经不错了,UTF-8 和 wchar_t 都支持,使用还是很方便的。关于 Unicode 的资料还是不少的,我的 blog 中的这篇 http://my.donews.com/chenyufei/2007/02/15/ibzgiazcpjomfbqpnlgqjwibpfojazyibyoj/ 中有一些链接,是我觉得帮助比较大的,其中的 FAQ 是有中文翻译的,欢迎去看看:-)
Jason # 22. February 2007, 12:52