QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>' ^* ?+ F' R, j4 {) h
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
9 ~* _; l. T9 L. @2 b节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
9 ]. x6 v) a2 h- s是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163% L% ]  k3 U8 X- x
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。6 Y* d4 t( p4 g; d# h9 E
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
1 r. [2 o" x0 ?" }' t% X$ j我给出一个例程供大家参考。</P>
5 f- x7 h( q, m( y<>+ G7 B& {. k6 F& B
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>  V% k0 w2 `" @( t% v! Q% H. O
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。8 h2 A" e6 y+ a* V$ m7 l) `
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。9 L5 V$ ^- k8 }3 e3 [" p
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
$ z/ p7 k- C8 d& u. o5 x9 kvoid __fastcall TForm1::Button1Click(TObject *Sender); X7 E' m: B' e& H# U
{
" Y0 a7 M' t  g  i        int nLength=Edit1-&gt;Text.Length();2 k8 G* @+ G$ D
        if (nLength==0)! L0 P2 R& [4 V& J+ c' T
                return;
7 o7 v, ^# V: p% H0 ~        AnsiString str="";
8 O, A3 d8 V. ^. ~        char *cTmp=new char[nLength+1];
: z* k4 H3 i( G5 g# Y        StrPCopy(cTmp,Edit1-&gt;Text);
8 {& b& G& F" B; x0 t        BYTE c1,c2;
9 V7 b& P$ D" O( x; W  k        int i;9 ~* l1 I  W2 Q+ L5 e( V& v
        for (i=0;i&lt;nLength;i++)2 `' C  M$ \* u* n
        {& M; L  t$ v' ~
                c1=cTmp;
3 T2 N  Q9 c$ ?  p6 x, O$ ]  E                c2=cTmp[i+1];1 A- r. J7 I! O# t* G) Z
                if (c1==163)//判断是否为全角字符- X9 W0 l) C- X& ~/ {
                {</P>
8 \! c+ G+ {2 z8 `' \1 q9 \* D( T9 g<>                        str=str+AnsiString((char)(c2-128));
$ J2 \# y  }, m5 D5 f8 ~0 y/ I                        i++;! n! g: A7 r' b2 C( p
                        continue;4 N! B  e+ @" {7 g' H/ K- R& ^
                 }% q1 c+ z9 m) R
                if (c1&gt;163)//判断是否为文字4 z6 R6 ^; f. _* |( \; g4 ^. u
                {</P>
% t" P0 x4 S; r" e' S7 u8 W3 m7 c<>                        str=str+AnsiString((char)c1);
: ~0 s: m: o3 ?# E                        str=str+AnsiString((char)c2);% R9 z, b8 G& H7 q* O; m9 z8 g
                        i++;# ?* n+ i, b( r$ u+ O  T8 @
                        continue;
# c' q* F5 v% U1 ^4 ~: L                }
  L( H' F5 j1 T* P9 Q2 ]' r. @                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理7 N+ @4 V) y8 Q5 r! Y1 A: W
                        {
  `; X, O! W1 g! q3 _% W                                str=str+" ";# _! y$ ]) ^8 l- ~$ Y; l$ s$ ~
                                i++;& b  H8 D2 x/ O& {, u
                                continue;
1 o/ |6 ]% J& ^8 f6 d$ o6 H# w                        }7 w' c2 o% t1 a) n# f, b
                str=str+ AnsiString(char(c1));
) `1 F( |* J% z% v5 |" e9 _( n( D        }0 b0 @' ?) ^* N- v9 o0 j
        Edit2-&gt;Text=str;
; ], K9 v$ s2 i* D% U$ x- L: b# p        delete cTmp;cTmp=NULL;! \+ V/ T! {1 {8 n
} </P>& Z( B/ y4 `! F, D* S7 v
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
8 ^. B  G# h, c, I6 c# h- S</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信
2#
无效楼层,该帖已经被删除
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年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    6#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2024-4-25 09:36 , Processed in 0.750695 second(s), 81 queries .

    回顶部