QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
7 K3 Q4 L1 G5 V8 s) X4 S<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字( w) D$ D. T3 |+ Y7 e
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
( V4 B7 F; q) I1 x是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1633 A3 j, x  z' }. B
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。- I' g$ D5 G/ O# q2 }& Z5 g# E) A5 `
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面- Z5 p  S! O, c6 w6 H; [8 |3 e
我给出一个例程供大家参考。</P>& l0 r- j! _" Y. ~2 Y
<>* r; j, X8 }/ [) a1 k: ~; I" `6 G
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>* J8 U2 S+ B) S7 g( v
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
$ v! n9 B5 _2 e* X单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
8 S/ j& |" C2 Y. T注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
  G# f- o( D% w& m( ovoid __fastcall TForm1::Button1Click(TObject *Sender)$ d9 Y4 ~+ T3 E) B" g) D) x
{3 M4 j$ ~/ B0 R1 j4 z6 n& N
        int nLength=Edit1-&gt;Text.Length();' Y  F7 e: ?- C' H, y5 e9 v
        if (nLength==0)% j4 U6 ~+ W  k  k
                return;4 j+ P& X& W; P  d8 m6 W6 \6 r
        AnsiString str="";
9 f* ~5 W# W* O8 u2 u0 c        char *cTmp=new char[nLength+1];% T  D6 p! G; A$ x# S/ m4 G
        StrPCopy(cTmp,Edit1-&gt;Text);
  Y( p0 O/ f, V8 T6 i        BYTE c1,c2;
( g- K7 b5 [. K# H7 E9 K5 E        int i;
' j0 ~0 y* v2 M" K4 @        for (i=0;i&lt;nLength;i++)
( u; r% o8 J2 }( D( Y        {
0 D% x( d3 D7 H, j( E# j                c1=cTmp;8 w0 k- a7 c& |3 B
                c2=cTmp[i+1];5 T% g( A3 K0 k% T
                if (c1==163)//判断是否为全角字符
' H! V: E% K' a# t2 H# h; X6 x                {</P>1 U$ R3 G! A1 ?. m# ^2 G! m
<>                        str=str+AnsiString((char)(c2-128));* i4 X; o4 G7 f8 x* E
                        i++;
8 E$ `( }2 r- }                        continue;0 S4 f$ k- q. ^: B
                 }; A2 D* A9 O+ B0 e7 P3 N
                if (c1&gt;163)//判断是否为文字
2 I2 z+ V2 l+ X2 [# I/ _4 [% ^                {</P>% @- a  O! {% e  D4 m/ u2 Y8 G  P
<>                        str=str+AnsiString((char)c1);* S3 A4 s$ w. k$ ~
                        str=str+AnsiString((char)c2);. K8 c. J+ v- g! b
                        i++;; ^! s4 M+ q2 V- C  F+ S# }) u2 c
                        continue;, p( X1 m7 C% E9 ?- J2 `+ w
                }8 Y( \5 T  A) P. H9 ]9 I/ f6 n
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
9 |% S9 ?$ ~! c, m2 }                        {
6 G) a7 P8 G( [) g3 N                                str=str+" ";
. l5 M. v8 H" f  W: Q1 ?4 p, A                                i++;  r+ g% i/ g/ u5 l  d5 N* Y  w2 C
                                continue;
- c* ?0 @, p5 X- C, l! X                        }
7 R. \0 q/ v- F7 W                str=str+ AnsiString(char(c1));5 \5 u9 r+ k' U4 F6 b" _- ?, i
        }
; r. ^: a, ]( A& T/ o4 T6 z        Edit2-&gt;Text=str;' f2 t/ x5 v- ]3 N2 J6 v
        delete cTmp;cTmp=NULL;/ M1 P9 G/ w$ w8 O" @! @- g) o
} </P>+ @  o6 m0 P- [0 [" L& m& Y
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
. S& s% E- z/ ]* z3 |! p</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信
2#
无效楼层,该帖已经被删除
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年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    6#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-18 08:01 , Processed in 0.393631 second(s), 81 queries .

    回顶部