QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
#
发表于 2005-1-26 19:31 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
+ v3 J4 s  t9 w4 l9 n% Q<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字2 T$ G: N8 X% q" I' t
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
) w, r7 u" p- V' O  H. l- u6 J是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1634 Y; k. I! O& c
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。) U5 d5 H% r: s5 k, \
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面' d/ `3 V/ d) c% s' `6 w# D
我给出一个例程供大家参考。</P>
4 r: q$ W4 S! S<>. @! J+ e$ {8 \9 w& m: P
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
& w/ \4 O2 }" D( G* i$ ^1 B<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
! E4 A, Z- _/ x3 |) s9 g单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
. `) y! ]/ r" V! e注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/& @/ \$ M, `5 d9 u" V
void __fastcall TForm1::Button1Click(TObject *Sender)* f4 U8 A0 Z8 W
{
. Q5 ]5 J$ z8 U        int nLength=Edit1-&gt;Text.Length();
6 P+ \) @: p3 Y$ y7 \8 F1 T        if (nLength==0)
" }1 ~7 c6 ^  i$ o5 Z                return;
; [6 }) I# \. d8 B+ X, I        AnsiString str="";
( ], v/ ^* }7 a% j' l( Q        char *cTmp=new char[nLength+1];* y/ J  X+ y! y; b& k& s
        StrPCopy(cTmp,Edit1-&gt;Text);$ y1 ?; k' ~5 X5 M' |! c
        BYTE c1,c2;/ _6 p1 Z% S6 i- e0 ?. ^
        int i;3 `( N+ P& `" S- r, t& m; Y
        for (i=0;i&lt;nLength;i++)
: _6 F1 m2 a( y$ g3 F) v; j  v        {
8 \( ?6 F4 N( k3 N* b) Z                c1=cTmp;) e2 p* J  l1 k7 b0 v
                c2=cTmp[i+1];
( V( f! y: o: S5 J) a* o! p                if (c1==163)//判断是否为全角字符, M9 {( y/ K. @% u6 m
                {</P>$ }7 ]# o, `. L9 {% z
<>                        str=str+AnsiString((char)(c2-128));
/ I1 C2 R. m. P. s                        i++;! i% O( }  _2 W# U" F0 C
                        continue;
. ^' L/ }5 u0 F                 }
% Z  c3 D6 \' @# O                if (c1&gt;163)//判断是否为文字
  s% a+ l& }! l: |0 d- G                {</P>
, G. i1 q! [  k2 U6 s  c<>                        str=str+AnsiString((char)c1);0 u7 _  {' ]& I2 D
                        str=str+AnsiString((char)c2);
; `2 w* S  z9 g& z$ R: C* m. E( D                        i++;
! o% `: g! Q! O+ o) _; m$ [5 K                        continue;
0 i2 W, D$ Z( L: }# `9 B  x5 y                }
- @/ a% l% G; B4 |+ _                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
! M% y9 E3 R/ O  S+ Q9 H( }                        {; X1 `1 J  C# S! Z/ M
                                str=str+" ";& \' L0 ]( v7 z8 u& W5 j+ J& m
                                i++;
( O* Q$ a6 e6 U; I1 A                                continue;+ W0 L0 H  E, }; s* U1 e6 I
                        }) z, F! ?; e: k. L
                str=str+ AnsiString(char(c1));
0 [% S: l& p6 S4 @0 J        }$ Z! r( Y- W$ X: W4 b( t
        Edit2-&gt;Text=str;. ^* R% W; V; R& r
        delete cTmp;cTmp=NULL;, M3 g9 {2 T% n* O2 e
} </P>, ]1 ^- e& z/ Q
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        % y$ @8 I. c0 R* r
</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信

4

主题

3

听众

656

积分

  • TA的每日心情
    开心
    2011-11-21 14:38
  • 签到天数: 41 天

    [LV.5]常住居民I

    群组数学建模培训课堂1

    群组数学建模培训课堂2

    群组2011年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    毛冲届        
    头像被屏蔽

    0

    主题

    4

    听众

    20

    积分

    该用户从未签到

    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    bllr.net        

    0

    主题

    0

    听众

    8

    积分

    升级  3.16%

    该用户从未签到

    自我介绍
    QQ个性签名
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-16 15:31 , Processed in 0.468890 second(s), 74 queries .

    回顶部