QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>$ ]5 z3 k; m* @9 [( g' _  e+ V  w
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字, C1 S2 p3 G. t/ t+ r
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
2 O" s1 Y4 a- p& F是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
! M+ A& k' T7 O- e: z7 M" _! g6 R,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
, T$ v% J+ v6 z# M& v7 S  J  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
* d1 S  V7 l5 T. u% v我给出一个例程供大家参考。</P>& b0 j. C! }$ E, r8 J+ n
<>0 J( w1 x# j7 ~2 T7 R
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>: ^0 w/ K8 U; _! q
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。0 C% p  m/ ?! p6 o- j/ W
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
( v$ |& W. `1 m& n( Y注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
) }; j+ q6 m1 j2 D: c) i0 c5 \void __fastcall TForm1::Button1Click(TObject *Sender)2 x+ r- [1 q; a5 p( _
{5 ^+ c7 D$ R6 K- }& I, a( O. n
        int nLength=Edit1-&gt;Text.Length();
7 n" h0 v6 o, Z7 b        if (nLength==0)
5 ~; Q1 Q1 O4 a: l8 B                return;
% t: W+ Z9 U* \# b* m# s! F+ \        AnsiString str="";% k6 f$ k4 E/ R/ B  E
        char *cTmp=new char[nLength+1];
/ k1 b) u5 V% z9 z9 y# ]        StrPCopy(cTmp,Edit1-&gt;Text);
: y, c8 w1 q; j/ ^" e6 X        BYTE c1,c2;
1 {6 b7 @. ?# o/ f) V2 k$ P; M3 [        int i;
6 j% N& j+ K2 Z7 M) z0 [( x        for (i=0;i&lt;nLength;i++)9 J; @" V% v: y3 D" l  q
        {
/ ~' H2 z  B9 J                c1=cTmp;, o2 z5 C! O8 u4 `% ?
                c2=cTmp[i+1];
& p. y* g# ~6 k. i4 j! m5 c7 v) ?! t                if (c1==163)//判断是否为全角字符" o5 H: |6 B- H1 n6 O( Y  g% q
                {</P>, S' \2 p! e* t. c
<>                        str=str+AnsiString((char)(c2-128));
2 d' J- }4 F8 J7 m                        i++;
, T2 l" I' b$ K1 l                        continue;
* G$ t" ?6 I/ ~$ b                 }
! z3 E4 H* ]5 F. t6 q! r6 c: W                if (c1&gt;163)//判断是否为文字2 [5 ]% g8 Y6 j" A* x% W! s2 H
                {</P>
1 I5 I6 P) D) Z- n7 ^% ]<>                        str=str+AnsiString((char)c1);7 [, o  x7 R0 w4 h6 d( l; Z9 F
                        str=str+AnsiString((char)c2);4 V9 z, a- J  S8 f
                        i++;: P7 I/ u1 N4 ~- f4 t1 |
                        continue;: c* _/ F7 a% M
                }
+ K  x/ J8 f* g7 m8 B/ C$ V8 Y                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
& J$ D+ L0 t4 n" d9 N: {/ M5 n                        {  j0 C# V/ U' n, E" p' m4 \( W
                                str=str+" ";
# n' K/ T, Z7 m1 s9 @9 B1 k, V                                i++;" _. F) i3 ?* u- M( y
                                continue;
; g( c/ m/ u& E                        }
* Z, |; r8 n2 j1 ]( ~+ R6 Y& ~                str=str+ AnsiString(char(c1));
( O* j; `/ U* e1 a$ W3 a9 {        }
3 x9 A; I9 f; N+ a        Edit2-&gt;Text=str;
& e# I7 Y3 j9 ]0 _8 ^        delete cTmp;cTmp=NULL;9 m6 U6 d9 q: k$ u# M3 A
} </P>
* Q+ G8 W7 }/ k, Z: `9 X  a8 P; R( j<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
. e2 o* P+ n, Q7 r1 K</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-4-19 00:56 , Processed in 0.452932 second(s), 71 queries .

    回顶部