QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
: n- W' l% e; R* f7 O* S, w<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
8 c! T% g- y- R6 ]节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
7 F1 I* V' P1 ~: P# L) i: v# ]是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1637 O6 F( `+ \* ?+ g2 o7 ]) Q2 Z1 F
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
7 I+ C2 f5 |8 B* |- [% E) d6 C  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
+ |5 Z2 M, b8 b' `5 a4 C) @我给出一个例程供大家参考。</P>9 U; N4 t7 D9 r0 v% e
<>
1 y8 v6 m: r" }- W  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>. }3 `. c: C0 ^2 ~& j1 p3 C- d
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
4 b8 d$ F3 P- }" m2 w单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
6 x, T$ |* X6 V1 ]注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/- l9 b$ l$ Y% _" d6 }8 J  `
void __fastcall TForm1::Button1Click(TObject *Sender)
6 |0 X3 C) C+ L* G4 `# y& H) l8 O{( ^$ d3 r4 c" `8 K
        int nLength=Edit1-&gt;Text.Length();
# {' @2 ]0 w9 H        if (nLength==0)5 [( Y  i9 D$ o
                return;
' E0 H  Y9 [+ G* F+ g( x        AnsiString str="";) s3 q: F0 N. S% k
        char *cTmp=new char[nLength+1];* N# a5 D. J% l: v7 B
        StrPCopy(cTmp,Edit1-&gt;Text);
& h/ e5 {6 A7 e4 `- t: P        BYTE c1,c2;
+ C9 v- n* r5 s( }        int i;
! ]" P+ ]6 G2 K# l! G: I        for (i=0;i&lt;nLength;i++)
# H1 C% M7 f5 J7 f" [9 k        {
6 l$ d. u4 Q# t                c1=cTmp;- t5 d" E4 U" P: W- d
                c2=cTmp[i+1];
6 }# {, U! ^2 ~8 X- C6 A, x4 Q( P6 {                if (c1==163)//判断是否为全角字符
1 a7 p' p) I1 c. Q$ O                {</P># G3 i1 c+ O- P; q3 m
<>                        str=str+AnsiString((char)(c2-128));6 m3 z' B, F3 T5 V
                        i++;
# o/ {& n2 t6 h  k9 Z                        continue;
; Y% I5 W9 I) @# n/ O) P1 ^# S2 s                 }
' U3 Y& k  I1 g2 j3 f                if (c1&gt;163)//判断是否为文字& F3 ^$ D: U4 ]- x( }- R3 L
                {</P>* o5 l$ g6 \0 S4 q9 K
<>                        str=str+AnsiString((char)c1);
# T- w% a, z8 P9 x                        str=str+AnsiString((char)c2);
; v6 `8 S$ E& }! _/ f& Y* y2 |                        i++;
7 c. ?& `/ {9 ^1 W- z                        continue;
2 _8 ~( ]& ?8 u' ~! D3 B$ v                }2 M: Q+ x3 Q) p3 ?- y# u9 X- m8 G
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理+ n0 a0 e- M: {$ z  }8 p% b
                        {$ A! z7 |2 Y* s, M
                                str=str+" ";3 X; f4 m. [: Y
                                i++;( \# X! x# o" y8 A
                                continue;) d0 w, }4 h$ G2 v( ~
                        }6 V2 i, p2 R! Q7 d. b1 X. W) O: b
                str=str+ AnsiString(char(c1));4 G$ s6 W7 @2 E8 n: ~
        }
/ c, k+ ?+ ?2 Y' t: s        Edit2-&gt;Text=str;
7 ]: M, W7 {/ V' w! C        delete cTmp;cTmp=NULL;
, u, O; R0 Q* x% u. @7 E} </P>
3 b. I+ W) G! q3 z/ c<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
- r4 }* w# ^; I% Z</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-5-26 06:14 , Processed in 0.497469 second(s), 82 queries .

    回顶部