人类社会所让我们深思的东西有很多!和生命有关,和自由有关,和爱有关,当然更和技术有关!

terminfo/termcap与curses/ncurses

上一篇 / 下一篇  2008-03-19 12:34:31 / 个人分类:C in a nutshell

问题来源于一用户的移植经历,关于汉字的输入,较生僻的字,例如如下一段代码:
#include <stdio.h>
#include <string.h>
#include <curses.h>

main()
{
   int erc=0;
   WINDOW *win;
   unsigned char str[20];

   memset(str, 0x00, sizeof(str));

   win = initscr();
   win = newwin(0,0,0,0);

   str[0] = 253;
   str[1] = 140;
   str[2] = ' ';

   erc = mvwaddch(win, 11, 12, str[0]);
   erc = mvwaddch(win, 11, 13, str[1]);
   erc = mvwaddch(win, 11, 14, str[2]);

   erc = wrefresh(win);
   erc = endwin();

}

str[0] = 253,str[1] = 140, 这个汉字既是"龑", 但界面上显示为"齸",还有以下几个汉字都无法正常显示, 如"爫" "寙" "謺"等.

之后问题的解决之道,是升级了系统的ncurses程序包,我当时并未理解这个包是干什么用的,于是google了一把,自己也看了看诸如man文档之类的,边学习边记载:
1、关于题目各个名称之间的关系。
terminfo/termcap: 一個特殊的資料庫, 記載著各種不同的終端機所使用的控制碼. 它讓上層的程式庫 (例如 curses/ncurses 或是 slang) 可以視不同的環境 (終端機) 來送不同的控制字串, 而在不同的環境下製造出固定的特殊效果 (移動游標, 字串屬性 ...) 詳見 termcap(5)
  1. 環境設定: 使用者可以用設定環境變數 TERM 的方式告訴上層的程式庫現在正在用的終端機究竟是資料庫中的那一種. 例如在 bash 下用export TERM=ansi或在 tcsh 下用setenv TERM ansi
  2. 常選用的幾種終端機: ansi, xterm, vt100, linux, ... 這些終端機名稱雖然不叫做 vt xxx 但也支援 vt100 系列終端機的控制碼。
2、关于GNU Announcing ncurses,
因为使用Linux,所以GNU是避不开了。http://www.gnu.org/software/ncurses/
这是造成此文开始时的最主要的原因,自由软件不断的再更新,发布的产品一旦跟不上,则会出现上述问题。
3、关于terminfo/termcap的详细信息,本来是想到这个连接去看看了,http://www.catb.org/~esr/terminfo/
可是不知道为什么Eric Raymond遭封杀!!!

下面这个链接的内容,算是很详实了,http://people.ofset.org/~ckhung/b/mi/textmode.php 
我的了解过程也不过如是而已,能否进一步的迈进,就看我自己的了,因为我正在beginning linux programming......
结尾处,看个输出::)
lee@lee-laptop:/media/sda3$ infocmp vt100
#       Reconstructed via infocmp from file: /lib/terminfo/v/vt100
vt100|vt100-am|dec vt100 (w/advanced video),
        am, mc5i, msgr, xenl, xon,
        cols#80, it#8, lines#24, vt#3,
        acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
        clear=\E[H\E[J$<50>, cr=^M, csr=\E[%i%p1%d;%p2%dr,
        cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J,
        cuf=\E[%p1%dC, cuf1=\E[C$<2>,
        cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
        cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
        enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=^J, ka1=\EOq,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD,
        kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy,
        kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
        kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, lf1=pf1, lf2=pf2,
        lf3=pf3, lf4=pf4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8,
        rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l,
        rmkx=\E[?1l\E>, rmso=\E[m$<2>, rmul=\E[m$<2>,
        rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$<2>,
        sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
        smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g,


that's all!

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2010-09-11  
   1234
567891011
12131415161718
19202122232425
2627282930  

数据统计

  • 访问量: 1325
  • 日志数: 171
  • 建立时间: 2008-01-23
  • 更新时间: 2008-04-14

RSS订阅

Open Toolbar