QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
% @' [# I* F; T" r<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
5 |) x6 e& w+ A4 k- \节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则: A! n, q4 n/ `! A7 _7 q
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163( A: @% K( j% c
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。: C( q$ r& i1 d& N; _
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面7 h4 H" O+ l0 x& Z& O( j
我给出一个例程供大家参考。</P>6 t; e; s7 S; _
<>/ u2 p/ O: z4 `; Z0 }  _9 K
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
& y9 D0 {- B% \! B9 F! A<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
2 p2 e& H6 F2 ]0 w$ W单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。; T" w3 D. H6 c( Y, ?
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/" ~& J: ~' K3 q3 h- t) L
void __fastcall TForm1::Button1Click(TObject *Sender)
$ ?: K. w% L3 B, P( Z) ]) U{$ O% O1 C# |4 y7 t
        int nLength=Edit1-&gt;Text.Length();
( o- H" M/ s2 [, c        if (nLength==0)
  {  B' h/ N2 T# {                return;
( t! ^4 ]0 {: i' a4 f        AnsiString str="";2 c4 L  J* Y0 T/ S& a
        char *cTmp=new char[nLength+1];. G# ?# o- i) [) I1 ]' r( G: Y
        StrPCopy(cTmp,Edit1-&gt;Text);
6 k6 D2 g  [. k1 _  M$ H5 s$ K% E        BYTE c1,c2;* q  v& ~+ t5 v9 b
        int i;9 r7 G$ Z0 Z. ~. O0 L& y" \
        for (i=0;i&lt;nLength;i++)3 I% ^" e" X/ x1 W) b/ S7 d
        {9 ~7 Q- h1 h% }2 L
                c1=cTmp;: b, z, w; v) p0 V" c6 ?
                c2=cTmp[i+1];9 a7 w* f6 b$ n* [$ o% i5 R
                if (c1==163)//判断是否为全角字符
5 ~# j% g- Z5 Z$ Q+ P# s7 N                {</P>
3 y7 Q& O0 |8 J6 h4 P$ A: ^4 y% L, ?<>                        str=str+AnsiString((char)(c2-128));' j; C$ X3 U0 ^/ J- j( }' U7 O
                        i++;
# U* }7 H; ]4 N                        continue;
# e9 @( P* q; \5 I. |# A( k3 D9 f7 E! ^                 }$ `8 D' Z5 ~3 X
                if (c1&gt;163)//判断是否为文字; m" a$ A8 W6 H1 T2 u
                {</P>/ i* m4 b6 e' l$ j; l
<>                        str=str+AnsiString((char)c1);
0 v. K( y8 Y  D7 k0 N9 ?                        str=str+AnsiString((char)c2);
: _' S3 }! ~/ G* c                        i++;
" l9 ~% \  F" O                        continue;
6 d7 Q/ M$ [- {3 r) X! h# D                }# @# ]& O  _' z! i" M6 p
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理' ~& u( h) R3 T% t# W
                        {
; {( @6 ^2 f: e                                str=str+" ";- G& ]+ p. |) P, O1 c0 @% M
                                i++;' U, V# l* l5 Z8 A: N
                                continue;- P# L0 `0 Q% o* j) k/ t
                        }
& E. b0 j$ e& y# Y7 X# E; z                str=str+ AnsiString(char(c1));' O4 q* t) |  L6 ^. H5 W
        }; O" j) Z( i$ A8 B* z
        Edit2-&gt;Text=str;
, o: y$ H+ A8 G" i5 b9 e        delete cTmp;cTmp=NULL;" |' w  N8 `. m, M+ b  R6 J
} </P>* E! [; N5 L9 u  ^5 ^% ^- J# ~
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        ( ?# t+ N. b, j+ f* Z
</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-18 01:45 , Processed in 0.400153 second(s), 71 queries .

    回顶部