QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>( }+ L. u# \: h; N6 A# k% ^
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字" ~! K% Y" q. z) s- y: @+ A
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则; H& T: }% Q9 E! Q+ o
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
3 a1 t' V5 K6 s# P,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
) u$ Y. D' g4 Q# R9 M# b) c5 w8 g  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
$ v2 }3 Y0 D  J# D5 @) r我给出一个例程供大家参考。</P>
; J  d) I; h1 Y9 r1 A<>
' A# d; Z. X8 g- u: X4 t2 ^  R  V* z! V: k  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
( {; l& Q/ D8 s8 t( R/ }; c. c<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。, a5 |# l' O. @; z& X5 N) [
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。  S5 Q( W; e9 U+ G3 S' m
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/9 i8 b" D1 ]( h# h6 ?
void __fastcall TForm1::Button1Click(TObject *Sender)5 q6 r5 i. c% _1 q2 l, \9 @
{: D% o* h' J) x3 ^4 T
        int nLength=Edit1-&gt;Text.Length();
7 q7 J5 S/ P3 o! C+ R        if (nLength==0)8 u0 R5 L: V9 l, L" h
                return;
- Z- Z$ y" ?: n1 W2 t7 G  p! e        AnsiString str="";
/ G: }3 @7 c, G8 c        char *cTmp=new char[nLength+1];
/ _4 q; a! E) P6 H- m2 U. k        StrPCopy(cTmp,Edit1-&gt;Text);
" ~0 B! t0 A; i2 m) e        BYTE c1,c2;5 S4 v8 u- m3 N5 m
        int i;
+ V0 M' L7 I3 T- f        for (i=0;i&lt;nLength;i++)
$ r+ R. i0 K2 x/ b        {
8 k& x- ]3 z7 N* H4 \- F8 ~0 u/ r* m                c1=cTmp;* Y  s% w9 ^  v/ r5 I, |4 g, b' w3 X
                c2=cTmp[i+1];
  M" o9 S) u6 |2 }                if (c1==163)//判断是否为全角字符
# p3 g+ r" Q3 Z/ t0 d2 p5 _1 j) A5 Q                {</P>- t- y. {3 U7 S
<>                        str=str+AnsiString((char)(c2-128));
3 u+ H# g% N5 }0 l8 T3 k                        i++;
8 _5 E5 m' r8 ~' u6 @+ \3 E% X                        continue;& m+ F' ^6 i$ @% T" x% f
                 }
2 y) t2 Q" k; K/ g2 o                if (c1&gt;163)//判断是否为文字) E) Y& |, }% s/ o
                {</P>8 C* l* v5 z7 o: X1 @" d3 D% q
<>                        str=str+AnsiString((char)c1);
: x# E- n- p# j3 S/ e6 x- }  {3 @                        str=str+AnsiString((char)c2);! e, d# z4 e: }% n6 x3 u
                        i++;( C: J2 x6 |( Z( J
                        continue;2 I$ I5 p0 {7 w5 k* ?& d* t  S% k
                }4 n* F( c+ ~4 Y0 e! ^
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
+ d" x/ t; I8 H6 w; K                        {
9 m% F4 I4 c2 ~2 }' K/ W) t! r                                str=str+" ";
. O! l. |% P; f& i- x/ w                                i++;
6 y- T; v6 a3 }8 c* b" x                                continue;0 O3 E  A& \/ G2 M- Z
                        }' p5 |* v7 U' `, h! E2 p. A0 X
                str=str+ AnsiString(char(c1));
2 p/ f% ]  B6 E, q. L+ j' s        }/ o  U7 P- H' C* f1 @. n
        Edit2-&gt;Text=str;& Y& J; X5 e1 V; l; {. A
        delete cTmp;cTmp=NULL;% E+ s- E: Z6 `5 Y1 G
} </P>/ S5 z" ?7 Q+ f2 z! `
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
; F9 L# ^: @4 Z" [) |# g9 K& O! h; z</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, 2024-4-19 16:19 , Processed in 0.387131 second(s), 71 queries .

    回顶部