数学建模社区-数学中国

标题: c++ builder:如何转换全角字符到半角字符? [打印本页]

作者: 韩冰    时间: 2005-1-26 19:31
标题: c++ builder:如何转换全角字符到半角字符?
<>c++ builder:如何转换全角字符到半角字符?</P>7 t) W% W8 p* p
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
/ |# i  `7 K- _$ V0 ]% Q. B, g节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
6 [$ x! F) V! _& l& a是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163- b( |9 ?6 ^: }* e& Z
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
" K2 a+ L% S$ j! M: f2 J5 T( S  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
7 x& J2 c8 ~  h' a我给出一个例程供大家参考。</P>
9 Z  S; F1 `5 f<>
0 Z! W, U- ^. H+ s5 ^5 @  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>8 h6 e5 l" C% ~! y. Z
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。$ q7 f" t$ g5 m% u
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。3 m4 I3 S: U5 L3 {
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/: D- z2 E0 ^4 c8 p
void __fastcall TForm1::Button1Click(TObject *Sender)
+ Z: u4 Q+ `  A0 c5 z5 G{) M  a1 F1 i6 ]/ l  a" ^
        int nLength=Edit1-&gt;Text.Length();
4 H( N4 B3 ~# o( j% |4 {; X6 u# r1 C        if (nLength==0)
" M- B) J/ t# f                return;
+ c9 }+ ]0 s& w' i. g        AnsiString str="";
8 |! ?" _/ Y( `0 ^) {2 b        char *cTmp=new char[nLength+1];
7 i; k+ l, ~; L% D( y        StrPCopy(cTmp,Edit1-&gt;Text);) M% l% Z( N% p8 p
        BYTE c1,c2;
3 b( d, c* I( \+ F1 p1 m( f        int i;
" G+ V2 Y' H: h% w+ ]        for (i=0;i&lt;nLength;i++)
4 M$ B# G4 L6 u        {3 }8 P6 ?( c/ x3 R% F* a
                c1=cTmp;  V9 G5 z8 {% V8 ~! Q2 G
                c2=cTmp[i+1];7 K7 U& T% f1 t  N6 p! D" O$ {
                if (c1==163)//判断是否为全角字符- {& W& X) ~. ]# ]
                {</P>
' T. |" b% J  n: W% U8 i, D  P, D<>                        str=str+AnsiString((char)(c2-128));
+ o6 o4 ^% t2 l                        i++;
( N% V5 Z# L) a* X- j                        continue;+ j$ P+ S4 k1 x0 M% v. H1 o
                 }+ t4 j% A8 U; z$ c) e
                if (c1&gt;163)//判断是否为文字
1 U3 ]$ U+ k' G+ M& x7 {                {</P>' o5 K$ c/ J' M; M; }
<>                        str=str+AnsiString((char)c1);
/ V& G. q$ P7 ^1 y! L; T                        str=str+AnsiString((char)c2);
8 u' h/ E3 A& B* F- f" C1 H                        i++;! A$ `, P" N! X5 {1 ~
                        continue;+ f5 U6 i6 Q( V& _6 x, w% _
                }
' B9 {4 H8 E) z3 q, P                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理0 y* s2 [4 ?: l- b' ?
                        {
0 Q, P1 f. d. E: i                                str=str+" ";5 R4 ]' {- r1 ~8 r3 k
                                i++;. z9 D* m, `0 M
                                continue;* K2 d' ^8 |# f% F
                        }
6 w5 P& ^" G) Y* q                str=str+ AnsiString(char(c1));
% ^7 t1 c6 s' k        }+ C0 l' v9 c  W+ A0 M0 a
        Edit2-&gt;Text=str;/ C. o2 Q) g+ {+ X' w
        delete cTmp;cTmp=NULL;
0 K5 x: o9 {0 M- B/ q} </P>
& d$ ?& h" J* |& ]<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
% o' S  n9 o+ z</P>
作者: bllr.net    时间: 2011-12-29 11:26
来了的留个脚印
作者: 毛冲届    时间: 2012-1-7 10:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: qaz11sc0616    时间: 2012-6-1 09:44
顶......叹为观止.....




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5