QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
8 w; n- h; F5 \9 h$ L+ n<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
2 R) R/ _2 R. O5 r5 V节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则6 H4 n. W5 p6 n
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1636 @1 \4 B) G7 H9 Q' q
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。8 b0 [$ h& C; p4 N+ L
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面( G1 H9 }. x$ ~5 v6 ?7 ^
我给出一个例程供大家参考。</P>! j, o( [. R+ G6 U& Z
<>
( E+ M9 @0 V; v  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>/ R' @( h$ _6 y4 ?
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。4 }/ }9 s8 P8 O9 b4 l3 X
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
* H/ R/ i- ?5 J- D" Q注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/6 V. O& z- f8 p
void __fastcall TForm1::Button1Click(TObject *Sender)
3 G- K9 e/ m# n. Z! V{
) d' d: a! U3 m6 ^9 V& P        int nLength=Edit1-&gt;Text.Length();
/ I) b3 f; K7 ?6 Y; }        if (nLength==0)" \- q$ d% d) b% P) j1 {
                return;
- U8 o" Y+ q6 ~. L4 \        AnsiString str="";1 s1 G! L$ P: b4 @3 G* {9 V2 `
        char *cTmp=new char[nLength+1];
/ y% L( V9 s7 d/ Q9 t* [        StrPCopy(cTmp,Edit1-&gt;Text);
, Z& `5 N  m. t- d/ [        BYTE c1,c2;
6 @# _9 Y. Z/ |7 P) _" S        int i;  ]9 _/ N$ |! X/ y4 }
        for (i=0;i&lt;nLength;i++)
& {( Y2 ]0 p& N1 f" a        {
. _$ P/ n$ `, _( @/ |; j2 O- }% a/ [                c1=cTmp;
  _) F; p6 z) e3 [- i1 R! K                c2=cTmp[i+1];$ `) O4 O  |2 ^- P: J( R! h
                if (c1==163)//判断是否为全角字符2 y: v* i+ _& N' a
                {</P>% s0 u: S$ k7 n7 x6 m  H" ?  b& L
<>                        str=str+AnsiString((char)(c2-128));
5 y; f9 m# K% C- z* p5 E                        i++;
& p# [$ Z/ X, x' m& J2 q                        continue;
; \+ {7 |0 O! r* T                 }% V5 }0 z1 ~) X% Y& w( f1 y# m
                if (c1&gt;163)//判断是否为文字9 h/ Y5 ]: r! n' W% k  u/ O: @
                {</P>
' H8 x* X& `- k" _7 B<>                        str=str+AnsiString((char)c1);
7 O0 E5 o6 E8 i+ ^2 ~% M/ x) Y                        str=str+AnsiString((char)c2);
4 z, V. N/ U& y& N5 {4 `                        i++;6 d8 Z: `5 `) G! u+ u
                        continue;  U0 y9 U9 H* f; y
                }
, V! C5 p' C( J0 x1 M) d# J5 J                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
- \+ x+ z& t/ r$ ?% B9 }3 x8 i                        {
; g  R! Y' R& K  a& w$ ~  w3 ~' h                                str=str+" ";; I6 s6 D7 I2 P2 P
                                i++;
5 X/ u" W  Q. I- s& j                                continue;' `: J; o' }: ]* V0 Y
                        }
5 ]! A$ H/ A# r                str=str+ AnsiString(char(c1));
$ F$ `0 t% W5 h3 l. x        }7 e' K7 X; |0 k/ q6 z/ Z, y
        Edit2-&gt;Text=str;( |* d' Y, f2 K8 D+ z
        delete cTmp;cTmp=NULL;
8 X" l  Z" C( e2 N# b8 ^8 B} </P>- n- D& Q; |1 K0 [7 N
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
* A# e# G. _) N</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-20 21:25 , Processed in 0.463330 second(s), 71 queries .

    回顶部