荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (kernel), 信区: InstallBBS
标  题: [BUG]FB2K BIG5<->GB内码转换输入BUG及参考解决[fwd]
发信站: 荔园晨风BBS站 (Sat Mar  2 21:23:41 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 2k.bbs@bbs.nju.edu.cn 所发表 】
发信人: fishchen..bbs@bbs.whu.edu.cn, 原信区: BBSDev
标  题: [BUG]FB2K BIG5<->GB内码转换输入BUG及参考解决[fwd]
发信站: 真茹BBS站 (Sat Mar  2 17:06:32 2002)
转信站: WHUBBS!thunews.dhs.org!jnunews.dhs.org!Zhenru


[BUG]FB2K BIG5<->GB内码转换输入BUG及参考解决


现象: 在BIG5码环境下输入BIG5码的字符时,
      不能把所输入的数据正确的转换成系统所要的
      GB码.在一般的输入状态不能正确转码,但用CTERM
      的输入条和文章输入栏写入再输入就正常.

原因: 汉字是双字节啦,而且由于网络传输的问题,经常会
      把两个字节分开了传送.所以就会这样了:>

参考解决: (文中所指的程序文件均为FB2000v1219中和源程序,
       并使用BBSD方式,在不使用BBSD方式时,请参考解决)

      io.c
      增加big2gb()函数;
      修改程序中使用到read2()处;
      <主要在igetch()中,在igetkey()中使用read2()可改可不改>

参考程序:
1.================
// BIG5==>GB 转换,参考FB2000的read2()写成
int big2gb(char *str, int len, int *havebad)
{
    register unsigned char ch1,ch2, *ptr;
    register int    locate, i=0;
    if(len == 0) return 0;
    if( len < 1) return len;
    *havebad=0;
    for(i=0,ptr = str; i < len; i++) {
        ch1 = (ptr+i)[0];
        if(ch1 < 0xA1 || ch1 == 0xFF) continue;
        if (i>=len-1) {
            *havebad=1;
            break;
        }
        ch2 = (ptr+i)[1];
        i ++;
        if(ch2 < 0x40 || ( ch2 > 0x7E && ch2 < 0xA1 ) || ch2 == 255)
            continue;
        if( (ch2 >= 0x40) && (ch2 <= 0x7E) )
            locate = ((ch1 - 0xA1) * 157 + (ch2 - 0x40)) * 2;
        else
            locate = ((ch1 - 0xA1) * 157 + (ch2 - 0xA1) + 63) * 2;
        (ptr+i-1)[0] = BtoG[ locate++ ];
        (ptr+i-1)[1] = BtoG[ locate ];
    }
    return len;
}



2.=================

将在igetch()中使用read2()中的那个for循环改为:

// 之前声明
// int big2gb_havebad, lastget;

    big2gb_havebad=0;
    lastget=0;
    ch=0;
    for (;;) {
        lastget = read(0, data+ch, IBUFSIZE-ch);
        ch=lastget+ch;
        if( convcode ) {
            if (big2gb_havebad==0) {
                big2gb(data+ch-lastget, lastget, &big2gb_havebad);
            } else {
                big2gb(data+ch-lastget-1, lastget+1, &big2gb_havebad);
            }
        }
        if (lastget>0 && big2gb_havebad!=0) continue;
        if (lastget>0) break;
        if (lastget<0 && errno == EINTR) continue;
        abort_bbs();
    }
--
                                      fishchen
                                   小瑜鱼 @ 暨南园
                                 fishchen@cnhelp.net
※ 修改:·fishchen 於 03月02日17:05:34 修改本文·[FROM: 暨大真茹19]
※ 来源:·真茹BBS站 jnubbs.dhs.org·[FROM: 暨大真茹19]
--
※ 修改:·fishchen 於 03月02日17:06:30 修改本文·[FROM: 暨大真茹19]
※ 转载:·真茹BBS站 jnubbs.dhs.org·[FROM: 暨大真茹19]

--
※ 转寄:.南京大学小百合站 bbs.nju.edu.cn.[FROM: 深圳大学BBS]

--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店