QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>& y* p& Z  e" c, B& T; r5 P$ V" K' N2 {
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
( _# y7 V) Y' t1 I, J  V. d节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则' K; u2 _( _5 r, p3 F
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
0 w7 G! _( K0 h4 x7 }. L3 }, \9 K7 w,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
% b7 ~& `* N: U. S9 w  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
; s& ?: P: X4 H, r. X1 I我给出一个例程供大家参考。</P>' `3 v- r  R, r$ @/ U, J
<>) F6 m$ c: k# {* L' O* I
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>' H" n5 f1 b8 }
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。. Z) `. x3 o( b- |9 r9 Q7 _, d
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。& F4 J. Z4 _; V/ U6 t
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*// P' G( f' D. V( t2 y
void __fastcall TForm1::Button1Click(TObject *Sender)( [8 a+ L& U6 h! I  J
{/ }9 b5 ]0 Y# {; e8 A0 P
        int nLength=Edit1-&gt;Text.Length();2 J' Q- L- H0 M0 E' f8 Q0 F
        if (nLength==0)
! r/ m! S4 e0 C+ r, R: I                return;  o: a& }2 }5 ?) y
        AnsiString str="";
/ p4 w8 O; i8 O1 _8 q4 ^' N        char *cTmp=new char[nLength+1];! l1 p9 b6 c2 ~7 U! H$ f6 _
        StrPCopy(cTmp,Edit1-&gt;Text);
3 Q; Q% N7 V+ J0 }) |0 S6 l        BYTE c1,c2;7 s* \: w2 L2 @  f8 h
        int i;" O( i$ l% a4 U* ^6 ~6 A- X. S/ A! o; c) f
        for (i=0;i&lt;nLength;i++)! l. c$ @1 e3 ^  q0 U+ z
        {/ H  i7 d+ k: d5 h$ g
                c1=cTmp;
3 F6 Q4 M# m* A6 |                c2=cTmp[i+1];# J1 K. k) T/ a
                if (c1==163)//判断是否为全角字符  ]: T% y9 M! W9 J% V: j+ X
                {</P># v& G" ^" ]' U3 M! f; y4 V5 ]
<>                        str=str+AnsiString((char)(c2-128));
6 _7 G) G, D0 a, b4 B# _                        i++;) I2 C* p% C5 ^" j* Z' o
                        continue;  i( p9 l! G  `% k2 o+ o
                 }- e# O% R. P. [& ], G0 \
                if (c1&gt;163)//判断是否为文字
5 {. @, J* H% X6 Y4 q                {</P>
. N8 A* ~. ~/ t, l  E<>                        str=str+AnsiString((char)c1);
5 E1 \% w2 ?: w& p: D" N" g; D                        str=str+AnsiString((char)c2);
( I3 r8 e/ p  l5 b/ R: W0 N2 y                        i++;0 h1 J0 \+ [0 G9 f
                        continue;
) N- Z3 [, V# m. A' ^  d) ^                }$ z* I" q  D; P$ |) `3 g# F* q
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理% ^+ C5 y9 h3 m
                        {
+ y6 \6 h) U; z; o2 V# _2 ]                                str=str+" ";! z5 M2 h2 n1 l# ^; f0 s; O$ s
                                i++;
) x7 t5 t# @0 W( }9 ^, A- J1 a; p                                continue;
2 x) k# q4 N  Z9 {6 c# I                        }4 N# x, n4 L* A, `& F; h1 h- C
                str=str+ AnsiString(char(c1));
1 Y/ l8 C- m) _        }* H8 T8 `  |2 X: V/ @
        Edit2-&gt;Text=str;6 H$ v# C# \! ?: r6 x' {
        delete cTmp;cTmp=NULL;
% L8 U: Z9 ~1 R$ c8 N8 @} </P>
. ]' ^) b4 Z* k4 F<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
1 J6 P1 H2 J$ `+ D! V' L1 V</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-8-6 14:00 , Processed in 3.653083 second(s), 71 queries .

    回顶部