Skip navigation.

flying in the way of my own...

ncurses的UTF-8支持

, ,

ncurses默认是不支持UTF-8的,不过作为一个中国人,我们用中文的时候还是比用英文的多的多。所以在编程的时候要考虑对中文的兼容问题(当然英语国家的人写程序的时候也应该想一下其他地方的人,这也是好多西方人容易忽略的地方)。下面就来说一下怎么在ncurses里面支持UTF-8编码的字符。

首先,要在程序的开始调用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的贴子里面找到了结果。

用gdb调试ncurses程序

Comments

Anonymous 11. February 2007, 06:02

Anonymous writes:

aaaa

Chen Yufei 21. February 2007, 14:38

wcslen 返回的是 wchar_t 数组中(而不是 UTF-8 编码的 char 数组)有几个字符。它与 strlen 相对,strlen 数的是 char 数组中"字节"的个数,而不是字符的个数。

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

精彩的讲解,谢谢啊

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies

January 2010
S M T W T F S
December 2009February 2010
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