QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>5 j0 L: \; u% [. S+ g- n" B
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
, T7 A$ n$ ]2 x9 y节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则0 p5 P* J3 W3 B1 M& }" R- b" p* C
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
% c, I3 y0 l# a5 z; g3 {* },(如'阿'为:176 162),我们可以在检测到中文时不进行转换。: Q+ {+ m1 i7 j( x: n  ?
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
3 D* d  D. s; o( D1 v我给出一个例程供大家参考。</P>
8 Z# {  Z  I- t! T- O  r/ }$ J<>
! D0 T/ z4 X" H  |  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
% n$ ^! S! Z& Q# Y/ {9 n<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。# P$ w; r2 f* L! ?" S/ X
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。' J  R# r1 Z) P6 r1 ^3 L
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/+ v  l" O. U4 C; M" @3 [: u
void __fastcall TForm1::Button1Click(TObject *Sender)
' A6 _$ a! L8 l3 M, J! `6 I7 T{
3 h1 \( ~5 q1 J        int nLength=Edit1-&gt;Text.Length();
) i# U$ p$ }) n6 V        if (nLength==0)& v4 U, Z, u; x! w1 y  G, Y
                return;  }, R  \( h8 S0 \/ M7 [
        AnsiString str="";
' \) @) {6 j9 y% Q2 p( _        char *cTmp=new char[nLength+1];1 B1 _3 _4 ~" z) R- K! D( H' F
        StrPCopy(cTmp,Edit1-&gt;Text);' F. f- Q8 g! a' u
        BYTE c1,c2;
9 g0 @+ m4 s9 L% m1 b: k        int i;
/ V9 ~! G$ _& G        for (i=0;i&lt;nLength;i++)
$ P# g  f1 n0 X& L+ O& y' ]        {. e6 ?: I- y/ Q+ u: R$ }
                c1=cTmp;
$ l: \4 G6 L! \  `! D                c2=cTmp[i+1];6 s* p0 k8 m7 w* [6 X
                if (c1==163)//判断是否为全角字符0 u8 H- j( z1 U  n$ I" S1 ?
                {</P>( H, F5 Y/ ?# @8 }& B; j
<>                        str=str+AnsiString((char)(c2-128));
2 r. |$ l2 u; z0 }                        i++;, F9 ^+ D" `/ d7 L4 X6 d$ D- D
                        continue;; n, V2 I* Z5 u  e- `" t
                 }6 S- w5 r  B0 l3 ~$ y- E
                if (c1&gt;163)//判断是否为文字0 @0 `$ w6 c! g* J3 J/ {) W
                {</P>
8 r& V! m# \( k( G( Y5 V+ l! [<>                        str=str+AnsiString((char)c1);8 E! ^2 _6 a2 s! `
                        str=str+AnsiString((char)c2);. J8 v/ l1 T# ?9 t0 C1 l3 o& q
                        i++;
. P$ g( ?: \, d" {                        continue;0 A/ k; {8 W$ t9 g$ S# o% Y
                }2 y2 }; t3 W( T+ ^
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理' O2 Y" y0 }; O) e) J0 Q
                        {
" p3 h! X5 b: \) \# {4 w; n/ ?                                str=str+" ";6 r; M4 k8 l$ H% m1 \
                                i++;
. H6 l, S+ W# l- w+ c9 z                                continue;! f& }6 N3 ^5 h  E. \
                        }) W# i& _7 {/ N" [% K! @3 G
                str=str+ AnsiString(char(c1));9 q% s9 H  ?, U" `
        }
- J' S) ?( B7 f0 E        Edit2-&gt;Text=str;" K0 a0 l3 }  ^) i$ w& y
        delete cTmp;cTmp=NULL;8 H6 ~1 q/ r" }; v8 d- T& Q
} </P>
/ N) q( z) B9 t' l8 }<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
0 D& a6 }: N$ D</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-9-1 15:43 , Processed in 0.334647 second(s), 72 queries .

    回顶部