QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
" Q1 Z( D( H- h/ H- O: G<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字' k% A: F, X! k" ?' `7 s& r
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
( a- U6 R1 ]) n5 _! [" X: T# I* {是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163$ v7 @5 f% I4 Z4 [3 s+ u* _
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。" ?% f* H1 M# ~0 c* D7 j
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
2 d1 ]7 e7 q8 ~6 j; V9 A9 y我给出一个例程供大家参考。</P>7 F; U! o7 D; j" a( {' f
<>
5 n* B- S7 W3 a: m. q% g( b! w  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
- x, \9 O+ o, y5 R% S  ]<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
6 C2 M( b3 J1 I  X/ ]1 M; a3 A单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。1 n& S+ y" L' W* f: s9 O9 t- o
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
+ w( O' ^+ N5 o% b. V/ [void __fastcall TForm1::Button1Click(TObject *Sender)
# E( W) {& V, Q) m{% N  k0 U1 i% c: `* R
        int nLength=Edit1-&gt;Text.Length();' }6 f; X& o- |. m( N) ^+ A
        if (nLength==0)
2 z% c! ^9 _9 O) g- f                return;$ f6 w- c6 c) O, E
        AnsiString str="";; {) G8 r* s; N7 J/ F
        char *cTmp=new char[nLength+1];# g) D. N6 J8 b0 O) d
        StrPCopy(cTmp,Edit1-&gt;Text);0 G2 e4 [7 O1 [) Z
        BYTE c1,c2;7 b3 W' M( Z$ c2 W" Z- n4 S
        int i;2 M6 \' i) g- p( I/ W1 o
        for (i=0;i&lt;nLength;i++)! [# M$ I5 a/ b: j3 d
        {# }( \8 p4 r0 s3 y# M
                c1=cTmp;8 Z8 b$ B3 A0 s+ U
                c2=cTmp[i+1];
6 h/ ^% l( ^8 P# g  A2 G: i                if (c1==163)//判断是否为全角字符3 y6 `0 |5 h! L/ x0 f
                {</P>& a$ `. c3 _* f2 K+ S
<>                        str=str+AnsiString((char)(c2-128));
. E& }& t) I) t9 e; U: c5 h- D) [                        i++;8 B3 i! ^% f* C, H) J; C) \9 Q: L5 r
                        continue;  S4 Z, X+ v3 A7 O- f
                 }7 o3 Z4 d7 z, |; V0 `2 }, s# T* c
                if (c1&gt;163)//判断是否为文字
7 z) r) M( a4 ?; r% Q, j                {</P>: l5 m5 V8 t+ a8 d* d+ e8 G
<>                        str=str+AnsiString((char)c1);# `" p" k1 X% [
                        str=str+AnsiString((char)c2);
5 i: r$ [, `- e                        i++;
2 z" [+ U, i) _9 f2 a1 w                        continue;, |- p$ j7 [  y! Y* ?4 I
                }
) f" T: Q: a& h$ j" K' d0 ?                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理. c: B9 O! k! z# P* r- q
                        {
& L$ D& Q- i0 u; T7 ^- K                                str=str+" ";
- F, L! R" b2 Z                                i++;% K% b2 F2 H# W! w8 {8 p
                                continue;
5 Y3 E  S6 u7 a; V7 a! P                        }% O0 E/ a/ g% `0 n
                str=str+ AnsiString(char(c1));
. t* \( i1 O$ E* T$ d1 O        }  c9 h. a% |8 @# E
        Edit2-&gt;Text=str;
: ?5 ?: C6 v- t        delete cTmp;cTmp=NULL;) M' I3 I0 }# F) n- Y
} </P>" q+ L- I' {1 U
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
  C, |/ j5 W( M) _9 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, 2026-4-21 20:43 , Processed in 0.433694 second(s), 72 queries .

    回顶部