数学建模社区-数学中国

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

作者: 韩冰    时间: 2005-1-26 19:31
标题: c++ builder:如何转换全角字符到半角字符?
<>c++ builder:如何转换全角字符到半角字符?</P>
- D+ K! M) q) C+ j<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字9 E4 h4 ^; x; w6 Y1 w- Y
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则7 s( F% a  @- \" l0 D- G
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
" Q8 V6 c/ ~2 L, m! J, t* m5 P" Z,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
  H4 F- o! j, N$ R" v0 b  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
) [  o" I/ e. s% M" o( h+ ?我给出一个例程供大家参考。</P>! t# s% E& p% q/ M5 ?
<>) _$ i1 Q6 F4 m8 \; u( I/ D
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
& Q  U( C% X3 _) {. b<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
* f# `) `/ L) z单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
: A" ?$ E# t; o& K5 v% b; q0 n注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
) j5 k5 w' E" C. U6 X4 i7 l+ ?void __fastcall TForm1::Button1Click(TObject *Sender)! c/ u' T1 S4 A( ~# p5 p0 A
{
7 {) }6 @# ~7 v$ e$ z        int nLength=Edit1-&gt;Text.Length();
# E" O0 b7 s  i2 C; {        if (nLength==0)
% ?/ C( j: m9 h                return;
2 }) k, w; S% C" U3 _! R1 F: E        AnsiString str="";! y5 w" H1 l, P$ [- t7 T
        char *cTmp=new char[nLength+1];9 F( H' e$ P7 n  _- h9 K( d
        StrPCopy(cTmp,Edit1-&gt;Text);
$ Z9 a  r: [8 N9 r        BYTE c1,c2;' c) Z! ^- H& P1 m
        int i;
/ N0 U; _, K7 q+ Y% |0 U        for (i=0;i&lt;nLength;i++)6 _( P+ d3 d& c  O6 l* F
        {/ b9 b2 u% X8 c9 x, ^
                c1=cTmp;2 J# Z* I1 _2 g
                c2=cTmp[i+1];
* Z8 `; C- d$ M) b* j6 J                if (c1==163)//判断是否为全角字符% d4 ]' R; W/ \# K" ]) B2 |
                {</P>
1 I, ^% |7 e3 Z$ O<>                        str=str+AnsiString((char)(c2-128));* X  n6 V$ n' {/ u; X2 y' N
                        i++;
: a9 `3 h3 @) M; Q. x                        continue;  C' P+ q( o: u& y. M7 {
                 }
4 @2 U4 f9 z$ I. S                if (c1&gt;163)//判断是否为文字! W* I% Q* q3 J; v; }( K) b
                {</P>
# R  H. B6 e. N; L<>                        str=str+AnsiString((char)c1);
4 A! O3 s, R& S( Z3 z                        str=str+AnsiString((char)c2);! d2 C# h4 C; E5 a& s6 t
                        i++;
2 q8 o4 l$ P8 h. n' O* g) l* j6 ^                        continue;+ i7 }& _. j% Z  D9 q  l4 Q
                }
. O9 y, f& E& L5 u8 J: ~                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理" ?& T/ R2 ~/ H7 m
                        {% f4 t1 D8 a7 |! l3 O
                                str=str+" ";
8 y* u; ^1 M) f  k8 d  Q1 O                                i++;( x7 _/ O- K+ v' p0 F. b' o
                                continue;% E' y  K% ~- S2 p
                        }
5 B( R6 X& n$ |/ {/ E8 T) ?& W                str=str+ AnsiString(char(c1));) D6 J! P0 T6 A7 }. N8 e; i8 C
        }% v& n/ k  l6 L" `& Z
        Edit2-&gt;Text=str;
5 f7 v8 a8 }4 J/ G        delete cTmp;cTmp=NULL;
0 D/ R9 A: |, P5 c0 b8 T) d/ ^5 A' K} </P>
8 M" u2 i3 w1 M: ]7 W<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
/ O7 W- D+ n0 }& s4 U# H/ _" g4 ]</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