QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>+ F% p- B# A. q; z) g8 I+ P+ c1 {
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
$ x1 u0 }# {  p; Q6 R节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
3 u- R' Y7 R- X/ \" \是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163. `; O0 ]2 w" [4 X% j; y
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。3 y, ]! W; ~$ J: m
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
  b% Q+ D$ f! t. `7 g我给出一个例程供大家参考。</P>
. T! y1 H+ |; G5 U<>
' S) u. d" S: u, P# [1 U- C  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
) c0 ^# O- S( Z. x1 c' u<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
5 h+ s! U# H. I) {单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。. I5 ]6 h' n4 o& Y! @' S2 l& j3 r
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
4 O1 p0 m5 i( `7 r+ c! X. u) xvoid __fastcall TForm1::Button1Click(TObject *Sender)
9 }; H" ?4 J9 J# ]' P& W{- L, i. s6 U# m
        int nLength=Edit1-&gt;Text.Length();# Q$ W3 l8 N  U5 |0 M4 k( P" i
        if (nLength==0)
# B5 c: c# z2 J; q/ ^+ a  N                return;. o$ ~$ S; U; Y+ e
        AnsiString str="";
$ ~# q2 @; T& O2 g9 S$ L$ T        char *cTmp=new char[nLength+1];
! l3 P# z8 P1 q4 ~- g/ I& Q        StrPCopy(cTmp,Edit1-&gt;Text);
6 h  r2 K( ?3 b        BYTE c1,c2;) e& w2 J5 l+ `
        int i;
1 O, y: e& h  E4 B3 Z9 n0 b2 p        for (i=0;i&lt;nLength;i++)
, k7 P* T6 q' r8 `1 b8 V3 _        {9 B+ r% @; c0 k3 j- C( }
                c1=cTmp;
  Z' Q4 m# \# N! T                c2=cTmp[i+1];$ [/ d# g6 }& d, M( H/ O
                if (c1==163)//判断是否为全角字符$ q3 }9 v$ [% ]( e0 z3 `
                {</P>$ b+ b3 v+ _/ n/ m
<>                        str=str+AnsiString((char)(c2-128));
( \% J; h- U! k6 b; z( p                        i++;
- X& ]& |7 N! Q% `, Q                        continue;
- @: D* |# x4 [8 t; g                 }
/ j7 r* }* N2 x  I9 u5 j& M                if (c1&gt;163)//判断是否为文字
7 O2 @2 G1 v8 U1 L" F" X2 c7 H7 p                {</P>2 V2 j' u4 `1 `! x
<>                        str=str+AnsiString((char)c1);+ q; y1 F* B5 g
                        str=str+AnsiString((char)c2);
- S) h1 E7 F1 D- k  e; o2 _                        i++;1 R8 O/ ]; V8 Q% \
                        continue;9 L4 m( V& a4 J
                }! ~: I& N4 }0 }$ Q# u( ]2 h
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理! i$ q8 E+ ~3 W# x  s* l4 Q) B
                        {* X( A, a7 V* C7 n( }# n& x
                                str=str+" ";
# S1 z+ J7 N: i9 l& X3 \, \+ k                                i++;- Y) a7 C$ B) h( \  S, L6 \
                                continue;& V+ K" ^0 ~1 N/ g
                        }
! t. r! z5 I+ {$ r# b                str=str+ AnsiString(char(c1));( u5 k& y' o; o& J2 q1 J$ z3 n
        }
7 g% a) b5 y' B        Edit2-&gt;Text=str;( R( T; |5 {& ~: B' ]
        delete cTmp;cTmp=NULL;
& h! e7 l, \. h& T$ i} </P>, f' w+ u+ u- S, V' d* p, |/ x
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
! E) w6 ~6 K- ?( Q</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-7-20 16:12 , Processed in 3.628422 second(s), 71 queries .

    回顶部