数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 19:31
标题: c++ builder:如何转换全角字符到半角字符?
<>c++ builder:如何转换全角字符到半角字符?</P>
, g" i  s# ^5 G& m; C<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字+ q) p( O" o  v5 F  {
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
' H. t. x7 j0 @) j" t: x是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
6 u1 q/ r0 A* R+ ^; `" Z,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
: |9 u/ K1 W$ K: A6 G  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面8 t( G7 u5 S5 i( u" u8 W# l
我给出一个例程供大家参考。</P>9 L# I9 w4 p# W. l3 S; k
<>
& m& r: p* R8 r  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>  ^+ I( ~- X& K1 T$ e5 U
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。! K  X9 L+ I4 D9 ^
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
: k& i( d8 P7 h; a0 e注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/* l3 `' I7 u! x0 k
void __fastcall TForm1::Button1Click(TObject *Sender)" D+ l  M! J! _0 C+ M4 t
{+ \3 V2 |3 [. b, W* d( C
        int nLength=Edit1-&gt;Text.Length();
& ~7 c& p6 t% U' O        if (nLength==0)
& u) K, T. F& l( ~: s" u: P/ t                return;( a" R9 \+ V6 B  I) c
        AnsiString str="";
' I+ c+ ]4 C2 Q' P. L        char *cTmp=new char[nLength+1];
' u' b8 _- u6 }& m- z        StrPCopy(cTmp,Edit1-&gt;Text);) P* l4 B* q7 I' i& M) }: _
        BYTE c1,c2;
; |( S- d( _8 ~        int i;6 y4 [* S/ ?! P5 K
        for (i=0;i&lt;nLength;i++)
8 j3 k+ _0 D2 R/ O. C/ B1 r        {
) b' F% A7 F4 E- i8 U9 G                c1=cTmp;- W6 _) Q2 D+ W: H1 {
                c2=cTmp[i+1];
) @* N" A2 e4 N+ s, @2 U0 L                if (c1==163)//判断是否为全角字符6 d4 t( d. K) W# T1 V
                {</P>
: ], p  s. z; J$ R, ~! e<>                        str=str+AnsiString((char)(c2-128));
- C6 u8 w1 C( b1 M2 I2 c                        i++;  J. k5 s$ g' a0 t8 {5 n
                        continue;
  i3 X% T$ r, `                 }( I# o1 k8 Z* o& Y* S) T2 L  d
                if (c1&gt;163)//判断是否为文字
# |/ b# G: Q; D" G8 Q                {</P>
3 O, z' R! Z: _$ Z<>                        str=str+AnsiString((char)c1);
% u# w( E2 i* P% {+ _, D# @                        str=str+AnsiString((char)c2);
% D) A  X2 A7 `8 R9 d                        i++;
7 c( W# D5 D" z8 W3 G% b2 H                        continue;
! @: h4 o4 |  J                }
2 Q7 s. U7 x+ l; |+ T, x3 J% I                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理9 U8 [; {" q1 N; Q# o
                        {; L% r3 ~! |. ~
                                str=str+" ";# u/ o7 k$ p; m) O$ i3 ~
                                i++;: a2 m2 O$ L. j4 Q8 ?
                                continue;
4 b% _* `$ @' z( S' d                        }
( M  K& E9 b7 R2 J2 O& J                str=str+ AnsiString(char(c1));
" ?: e# Y9 G: F# M: _, N        }& C) G6 C! }+ W& i. N* w! ~
        Edit2-&gt;Text=str;6 D  A# E6 ~# `% o6 ]1 \
        delete cTmp;cTmp=NULL;' j3 E) m5 T# s' B+ e+ u. ?
} </P>: p8 Z2 C, o5 \; U
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
( m9 g# z2 z6 h( P/ v</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