QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
. {7 C" J- u' h* Y: s$ C7 E<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
; _$ t6 n) F# N" b节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则# g, i# h6 a: l0 A% U& J/ X
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1630 l' W. z0 E2 X' q
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。2 F; U; ^0 P7 {: p* H
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
( r  |0 e" j  y我给出一个例程供大家参考。</P>
. J) d9 e* Z! \" Z& L<>0 E' N9 F* {" h- w  P( {
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
+ I( D: T9 d! x& C6 b/ N<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。3 i1 X+ G( }$ t, @% `
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
5 e. Y* v# U% k8 h2 E, W注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
0 _9 _3 }1 [  e8 r+ T0 |void __fastcall TForm1::Button1Click(TObject *Sender)
0 N3 R" ~! h# S& \{% L5 W( ~1 B# O8 [# ?& m; x4 X- }
        int nLength=Edit1-&gt;Text.Length();
/ }6 Q& K- n: f- D/ t        if (nLength==0)
8 W# Z/ P/ c7 S                return;, p; ]( o; n- R8 h( E# X" B1 M/ `
        AnsiString str="";
, E# U6 o; |( @7 @* c        char *cTmp=new char[nLength+1];
  T. f* k  ~/ S* Z% O/ m        StrPCopy(cTmp,Edit1-&gt;Text);
" w' M/ t2 A- ^- a        BYTE c1,c2;) k" T3 ]. c2 I+ b6 q
        int i;
% l  l5 B: o3 E( |; A        for (i=0;i&lt;nLength;i++). i; O+ @8 C8 [# T
        {9 q  {4 T& h9 F5 J( Z: T
                c1=cTmp;
) z7 S4 }5 p, n) l/ [3 I/ s                c2=cTmp[i+1];
" n( u/ e* L" B$ d+ B                if (c1==163)//判断是否为全角字符! Z, Z3 t2 V) v/ \7 n- @
                {</P>, M" B% e+ a% W; V4 F
<>                        str=str+AnsiString((char)(c2-128));
( J. C: T. N" E6 O* j) A8 g9 |                        i++;
. }5 b% u7 Y9 w2 A0 E                        continue;- }( M6 j' d4 O  y6 Y1 a
                 }
* ], m# t9 h; q! E                if (c1&gt;163)//判断是否为文字
# Q1 v( ^8 @9 o* s% l) D+ A                {</P>8 B: O0 ]3 _6 b4 t# l& ?4 u* s
<>                        str=str+AnsiString((char)c1);
* z$ y& ?+ W9 U5 u0 f$ t" t                        str=str+AnsiString((char)c2);
2 ^) ?( E  M1 v5 ^: O                        i++;
, v6 V" z/ T- l% f4 C! s: H" e                        continue;6 O3 b% y- c% r( E; f4 b# s
                }
8 d, H9 J: Q6 D: v( m/ T3 k8 m7 O                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理$ S' ^& [- |5 z" j. U
                        {
3 L$ W/ P) c8 M. p& t' j  c+ u& q                                str=str+" ";
: k% F$ m4 ]% t; A  {                                i++;
  q( k. l/ L8 u                                continue;
+ u0 h, X$ u1 L- Y; B3 v  t                        }
/ n7 v' o' J2 ^- A6 K/ a                str=str+ AnsiString(char(c1));
  i: e. |# W4 w0 k$ _0 s        }- s( h% \" W8 a3 _" Y+ O9 B' F
        Edit2-&gt;Text=str;( Q: a2 Y; {* ]
        delete cTmp;cTmp=NULL;
4 `: s$ v$ `3 J% O% C} </P># Q) t) l  ^7 p- X4 j
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        5 |% S% f5 A) h4 K* L
</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-5-10 09:58 , Processed in 0.554997 second(s), 71 queries .

    回顶部