QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>8 f9 L4 d1 s3 J+ u
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
! a+ k  [; ^' P+ ?4 [9 |节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则% V# I) E+ p) A: |0 r/ J
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163$ a/ g% N& ~8 |
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
. N8 q! _6 }) h1 ~1 a6 N  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面; g4 H- `3 I  q6 `$ y
我给出一个例程供大家参考。</P>
, B( Z2 T* K' E# f6 [: w- c<>
& Y& I3 b2 K% E" v6 R  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>& x7 t; V) j- s: p% u
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
/ H) _5 j9 ?8 x1 s单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
5 U3 w& g" m$ U7 t9 R) X9 g5 r注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/) Q2 E, `7 \. X
void __fastcall TForm1::Button1Click(TObject *Sender)
' i1 I1 ]! |/ d{/ |# G8 x& e7 Y
        int nLength=Edit1-&gt;Text.Length();+ F8 t1 I( H" |
        if (nLength==0)
9 f, ]) K& X# |7 P& v                return;
. [/ i/ y: Z1 V) e8 u' }+ N; s        AnsiString str="";
- r1 z9 _& D" R9 K- h        char *cTmp=new char[nLength+1];$ f1 F2 G- k8 S( B( o; Q2 Q: V
        StrPCopy(cTmp,Edit1-&gt;Text);
/ {9 j7 z. Y8 L, R        BYTE c1,c2;
" s0 |% M4 @" J  N; V& d* c7 ^        int i;% D5 l5 S# \- C: J* F
        for (i=0;i&lt;nLength;i++)( s  [6 G& u6 o* u4 }+ O, o
        {
! X; y" @# h" T( t5 i                c1=cTmp;* o/ p9 k8 ~( R$ n. s! B
                c2=cTmp[i+1];/ P% F9 G& X- _, \  r
                if (c1==163)//判断是否为全角字符
" @% J/ f2 k8 ~( F( V                {</P>: l  l" q. r  a  x' e/ V
<>                        str=str+AnsiString((char)(c2-128));
2 J* X& S' L; X4 C1 D                        i++;
# B. ~3 ]( P" k2 F2 S                        continue;
6 B1 r0 W0 j$ d3 Q                 }* d2 }: h2 n. a& ^
                if (c1&gt;163)//判断是否为文字
' U$ R7 h( I4 t. w; m0 t                {</P>/ ?( k" C8 r4 F; _: ~
<>                        str=str+AnsiString((char)c1);: I9 m4 i: ], d/ ^
                        str=str+AnsiString((char)c2);' `+ d" w8 n& \9 @
                        i++;
9 p1 f: c7 `; M* K; c5 ?                        continue;, q$ f. c! `% G7 }( s; {- y
                }
! ~! ~; g; v4 C7 X( I, J2 c' I                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
& @, ?6 ?, `1 [5 I5 Z8 s                        {; r  g' L7 n3 j  t) A2 M
                                str=str+" ";2 |4 T6 w* i% p+ K* o
                                i++;
7 _, v& z8 f! d1 F5 s# K9 f( c$ E                                continue;
- ~2 r: e# ~  t" x' N/ A2 M7 B. k                        }
# M# N$ t7 l$ q7 P                str=str+ AnsiString(char(c1));
- O( \3 p, Q+ @' W5 `! @7 q9 J: S        }, D) \/ O, O( H
        Edit2-&gt;Text=str;
4 ]7 r1 N: N0 `. _        delete cTmp;cTmp=NULL;( y) j- V8 X- x5 r" o1 ~
} </P>
( v( r: a5 S# v: y4 H<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        6 K  J1 O5 j  n+ D( @" c
</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-20 17:13 , Processed in 0.410921 second(s), 72 queries .

    回顶部