QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>0 l- ?2 Q/ P* [9 E* J5 \0 ]
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
, T8 |$ E8 X6 F- [. W6 s, ?节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则5 ~2 h4 S2 Q/ G) N
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1631 v- C# _# v, I: v
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
- U5 T# A. {6 R7 _: t9 b  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
$ U+ T% J( \1 F' U  \: y4 q我给出一个例程供大家参考。</P>: v* r5 ?! [  O- `
<>
. H5 F4 Q0 r0 U) G$ i  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>( K0 p0 `6 b9 z1 E
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
0 E: y5 C" R$ X' h单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。6 H. y! ?4 M. I: Q" B2 r$ ~) _
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
" |; w+ \' c, U+ d0 Jvoid __fastcall TForm1::Button1Click(TObject *Sender)
) r; h' F9 s0 }1 O{
1 r! z/ t! ^3 h' ^  h        int nLength=Edit1-&gt;Text.Length();8 m" k! {! K" {' b8 e7 H, ^
        if (nLength==0)! j' W" e5 E1 L/ X5 k7 K$ S; ~
                return;
  n4 F; g% X, t- z5 j# @        AnsiString str="";
) }& J4 a2 O' x  V1 J; T        char *cTmp=new char[nLength+1];
2 n; o, \3 p5 l  U, _        StrPCopy(cTmp,Edit1-&gt;Text);6 ?' z  m2 z, B( F
        BYTE c1,c2;
& T0 c7 R# |) |6 S        int i;
& U' `# w0 n, e/ O, U2 E        for (i=0;i&lt;nLength;i++)" O3 H& C6 D: ?  h
        {
$ F  N9 l; C% V- H6 [                c1=cTmp;
- r8 u: f. u+ j2 E/ A( V# \3 l                c2=cTmp[i+1];8 w- @" {, m3 @7 T* u, B8 ?* B/ I: t. v
                if (c1==163)//判断是否为全角字符
% _& _; d9 k, c" k' P                {</P>. }3 }3 x* ~0 t" S3 l6 @9 d
<>                        str=str+AnsiString((char)(c2-128));# J: ^. }8 ?6 H! s: I' I$ J9 O
                        i++;
; g8 N1 W/ ?& B                        continue;
7 G% I- Y3 e8 n" q                 }5 d: h! Q: o# W
                if (c1&gt;163)//判断是否为文字5 n6 y( V0 f8 H& O
                {</P>
3 {! i( X2 H. J<>                        str=str+AnsiString((char)c1);; S7 K: [) X! x% W
                        str=str+AnsiString((char)c2);/ g# d# e+ z$ K1 p7 A1 n' ^- V  \
                        i++;
$ Y+ r& z% J7 f5 s6 J0 N7 U- {8 {. ?                        continue;
+ `" i* J: \" x; l1 s                }
% l* ~' S8 _0 q                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理$ O; Z) \, q- e7 `1 R- Y
                        {, d3 {/ b* ^! B5 t# h" h
                                str=str+" ";
; T5 U' T; r$ s- W' J                                i++;
) r8 L! S. P8 B3 ]3 ^) C                                continue;
. D9 `( i$ K1 |$ G9 Q+ V4 m: m                        }! x3 h. _- ?- l" A4 N3 V9 K
                str=str+ AnsiString(char(c1));
8 W2 I+ {. B0 G4 s" \. @/ V2 W        }- J. I8 y8 y$ K+ }' R6 M$ {2 K
        Edit2-&gt;Text=str;, ]2 m" v: G' i9 w9 e
        delete cTmp;cTmp=NULL;
7 X# O) C: v) l* Y" q+ c} </P>$ ^! G2 M& q% l) l5 Y5 M
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
5 K# e) t! m, O9 j( h7 W, h</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, 2025-7-13 17:54 , Processed in 1.038601 second(s), 71 queries .

    回顶部