QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 13606|回复: 3
打印 上一主题 下一主题

c++ builder:如何转换全角字符到半角字符?

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
9 d0 _- ]3 [5 X5 s+ n" @<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
! k% m4 |% O- S* x节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则: Z0 p" p  W, f1 R+ i
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163. o4 B  H3 I2 j/ ?6 s
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。' v5 f7 ]4 @- q" h
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面1 r( z0 z2 d) f5 X, \
我给出一个例程供大家参考。</P>
4 X& w' d) x5 c9 I) W<>
& c9 }" u: d" m/ Y* F& K0 X, |  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>! b7 R: E. u1 v$ U  p
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。  n4 w# u! D& J# o: [( b+ e
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。- i! A  F6 H* v2 e" w* ~
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/7 E% O  `# \5 k+ @3 s, |
void __fastcall TForm1::Button1Click(TObject *Sender)
* f6 Z1 Z5 u9 r' ~: s{
9 P0 p; F6 x* h3 J! o4 a3 q' m        int nLength=Edit1-&gt;Text.Length();
5 j' ~0 e5 r7 r- j# w1 f0 A        if (nLength==0)- l7 x2 U2 ?  }$ Q+ H& N$ W% j0 ]
                return;; r1 A' A9 \+ }4 _
        AnsiString str="";+ \2 d3 P; M( N$ h! C! o7 p
        char *cTmp=new char[nLength+1];
( S; ?* B9 V0 y$ _1 O+ J6 {        StrPCopy(cTmp,Edit1-&gt;Text);( z! U+ g8 a- Y2 {- J, b
        BYTE c1,c2;
$ f* r2 b0 G% b: ?* g3 q        int i;7 H  ~5 e& S" |9 j- Q
        for (i=0;i&lt;nLength;i++)5 b3 _. @$ W0 z0 }6 L+ T" ?
        {3 s8 V8 z3 o4 O( L: @
                c1=cTmp;  l  o2 b. A9 v+ d% j* X
                c2=cTmp[i+1];
! X( a0 i. m" {/ v% a" j( {                if (c1==163)//判断是否为全角字符  c: ~3 o/ ]. P9 Z+ i# e
                {</P>" [* Y* }8 e3 d2 ~, S
<>                        str=str+AnsiString((char)(c2-128));- C, u( U7 w) H. U
                        i++;- x: p. M0 w( u- {8 d
                        continue;2 s- }+ C0 B. b) R5 G3 A3 S
                 }, s4 s4 P6 c# U( W$ m, i1 ^
                if (c1&gt;163)//判断是否为文字
7 R7 n% F$ p" j# X* v3 x, Q                {</P>9 y6 R1 T! v+ \- e
<>                        str=str+AnsiString((char)c1);: X% t! W/ z6 O2 a
                        str=str+AnsiString((char)c2);& A' l/ z3 l+ i2 u
                        i++;
( T' f; h  r& o* s5 ^1 D8 w! N                        continue;  I* Q7 p' ^" |/ w' K
                }
9 j) H( L# Q6 z                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
3 O9 E7 t# y8 r  Z                        {: X" o9 u' a* C, Q! D) k) t
                                str=str+" ";
6 x& m2 d( H% L: P6 ]3 R                                i++;
7 }. `2 }) A0 W+ l                                continue;
& q8 f7 |( q6 ?( M$ q1 o+ Y5 D                        }. X) X% B+ [8 g4 U
                str=str+ AnsiString(char(c1));
" n' P) y; v- v# u, L. r        }5 E6 |, M+ ]1 }6 W+ Y
        Edit2-&gt;Text=str;4 U8 o3 P% z# Z+ Y* ]/ ^5 y. D
        delete cTmp;cTmp=NULL;
" |' Y  g$ I/ r& r} </P>" S* c' e4 T+ M6 D6 b/ C/ P
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
) `0 u( W* @8 R. F+ {</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信
bllr.net        

0

主题

0

听众

8

积分

升级  3.16%

该用户从未签到

自我介绍
QQ个性签名
回复

使用道具 举报

毛冲届        
头像被屏蔽

0

主题

4

听众

20

积分

该用户从未签到

提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

4

主题

3

听众

656

积分

  • TA的每日心情
    开心
    2011-11-21 14:38
  • 签到天数: 41 天

    [LV.5]常住居民I

    群组数学建模培训课堂1

    群组数学建模培训课堂2

    群组2011年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-17 18:13 , Processed in 0.444451 second(s), 72 queries .

    回顶部