QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
! h& }% w) B: G% W0 O<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字$ g" M/ B4 Y' Z& \
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则" q( J) @' U3 i6 i2 T$ y5 ]
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163% z2 Y3 @: k, s2 t* w
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
; G  }, e; f: e/ i+ v  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面, U! V& H6 I3 N% c& A, \
我给出一个例程供大家参考。</P>6 Q: z  D# s3 }( P- P6 e2 ]3 I
<>
6 e2 ?$ t' r4 D5 G  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
; U7 L5 M9 T! g* U<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
: k) w3 H3 V! q# I  @: _单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。6 |& X/ V& p1 N8 C9 o0 I
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
6 u* B/ B' x* @/ nvoid __fastcall TForm1::Button1Click(TObject *Sender): ]3 E6 o3 M, S
{" n2 P& q9 j: r9 m: E3 a
        int nLength=Edit1-&gt;Text.Length();0 \; j  U- W1 H* P, F
        if (nLength==0)
. a  `1 H/ J- a3 O$ {: z5 z9 a" w                return;# H9 N- Q  n5 {8 [% g' R& t
        AnsiString str="";8 z/ l3 \7 s" O' y
        char *cTmp=new char[nLength+1];
1 P9 v1 I8 r* t& t        StrPCopy(cTmp,Edit1-&gt;Text);
4 C& b4 Y  P+ I  D0 ]1 Y  `3 n        BYTE c1,c2;
3 S: X7 y( D' X" h3 c        int i;$ T3 c; H$ `$ a3 c3 D
        for (i=0;i&lt;nLength;i++)6 d) l. Z. _. [. r2 k
        {  w/ `4 [. `6 m! ^# \( Z
                c1=cTmp;6 V4 v8 F  H* o4 U' h% z+ n, A
                c2=cTmp[i+1];  Q& [1 _' B3 z/ Q/ Q5 Y
                if (c1==163)//判断是否为全角字符
8 x# x4 g! D' ~1 [7 J) b                {</P>
. \3 `* D- k* _" K: M. Q3 Q<>                        str=str+AnsiString((char)(c2-128));, a! r+ D/ T  {8 U0 j" ^7 o' P
                        i++;" _; O( _! P# ?  c; N$ z- s4 i, |
                        continue;
7 U* ]9 k  H  U% x; F( A                 }9 Z9 c1 l9 f* `7 J
                if (c1&gt;163)//判断是否为文字2 j! n# X, `- L* e2 @1 y
                {</P>
  |  m( B: L  a& d' I# c' `0 G<>                        str=str+AnsiString((char)c1);
+ R) {2 E  y* T7 T; D                        str=str+AnsiString((char)c2);
, R6 N5 p5 P/ }5 J8 k4 S2 L/ w                        i++;
2 [& X8 V) T! |% V) A- P/ @) u                        continue;9 @5 L  J+ k; k. G9 h
                }" ^+ g9 j+ y7 x+ S1 }; i: l
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
* ?: g( s( a9 f5 f/ y                        {
; k- G9 [# C9 N2 H                                str=str+" ";
' y+ d  I& b1 s6 _7 }2 `                                i++;. q+ e0 X: ?* y0 w) j
                                continue;. C3 K2 q. k4 k: S4 C/ t1 m  f
                        }0 o# T  }$ h0 D  `% ~
                str=str+ AnsiString(char(c1));- f( C, O1 L- I' z9 x; g
        }
8 q# c: U, l2 c' N$ s        Edit2-&gt;Text=str;1 u) a) o9 P& f: m
        delete cTmp;cTmp=NULL;
" m6 K! t  r9 u" I) h} </P>$ X% P4 I7 ^8 Y0 I, {
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
2 H9 {2 {, g& l$ @. f$ O, s</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-8-6 11:16 , Processed in 0.656821 second(s), 71 queries .

    回顶部