QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
: B% B4 m; E$ X. B$ |7 A<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字/ B. Z  z% J) n  H* z/ `
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
3 T! U  b, ^8 I% w7 k& n9 k是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1633 r; J. X3 d' d% F3 c  O+ v
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
8 P* I' r$ z4 [" {# Y  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面. M0 Y2 ?2 M9 c+ I1 p8 U& H$ [- b
我给出一个例程供大家参考。</P>
9 |1 b6 j# N+ {# J8 l6 L<>
. q- f" s/ y$ l" d  n4 J  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>& b& }5 p: m% y! {0 s' F* K' ~
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。+ s6 A( n( b" \) w" u. R0 [" Q
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
; d4 |4 p$ ]: H  N* o8 @注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/' d/ m0 r+ @$ J0 `4 T6 x
void __fastcall TForm1::Button1Click(TObject *Sender)  H1 `! }$ H4 o; I8 j- J; V
{
$ H0 {5 @: O: u" g4 C2 A$ A        int nLength=Edit1-&gt;Text.Length();
" K0 }% r. |1 c$ K$ g) S        if (nLength==0)
3 f/ L- v' ]7 \9 v: [# P                return;
4 p; I! p9 J2 ?! _        AnsiString str="";8 y" t) y, n1 O0 r. T5 {& w/ U
        char *cTmp=new char[nLength+1];
0 }7 t7 @7 F/ y& ~        StrPCopy(cTmp,Edit1-&gt;Text);
( a5 f$ H# \2 T        BYTE c1,c2;
, v: Z5 g! r! o6 `$ I1 P        int i;
3 J! u$ m+ D1 _6 c3 |        for (i=0;i&lt;nLength;i++)
& w0 m4 \  z" [. F- }- |% X        {  a/ l& d( ^8 {' {% Z
                c1=cTmp;2 |) P, g* y$ r7 w
                c2=cTmp[i+1];2 A' \6 j) z$ ?/ `# i% P; o
                if (c1==163)//判断是否为全角字符
7 [- T" {& F7 A& R3 J0 ?1 r                {</P>
8 [! b- x; Y3 _1 W4 F3 @/ d' w<>                        str=str+AnsiString((char)(c2-128));
5 ^7 b4 _7 r. T                        i++;0 X- v6 V7 X! Z, i
                        continue;
  R! @  L9 S, s; r2 x                 }8 g- h, r; A3 s4 Z# d/ X: H
                if (c1&gt;163)//判断是否为文字
6 C! W2 W: F4 j6 Q$ S3 r                {</P>
  P- G0 i# J# p: A<>                        str=str+AnsiString((char)c1);
/ d% C- H! k& v' }7 |( N/ m3 O% ~                        str=str+AnsiString((char)c2);
8 _3 n, ]7 v' _% J4 H  s                        i++;
0 ^" |% L7 B, O                        continue;2 g( S, |( f2 ^% O- F1 @# D9 \/ Z
                }
$ X- y' s5 U8 B* H; g% F                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
  Z6 S! F+ z9 \2 o                        {
9 A4 v2 ^' w+ Q& V2 e! [                                str=str+" ";
* p0 X* F7 L. z# e" b- n3 C                                i++;
# Y, f" h' K; Z' Z                                continue;
6 r; p3 Y% h5 w* P7 L# P                        }5 W! d8 _9 m6 i0 _
                str=str+ AnsiString(char(c1));
, x( G7 |/ Z, D% E        }/ \' d% ?3 ~& q% F& V8 I
        Edit2-&gt;Text=str;
3 q$ R: {6 M5 Z0 i! D) R# D        delete cTmp;cTmp=NULL;0 Z5 A8 e( C  `9 D& c' \3 n6 D
} </P>
1 L% G- f- t! J' ?  x4 [+ g$ o3 f<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        ! A# H9 [+ \) m, y; P/ p; y! j
</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-6-17 02:42 , Processed in 0.431672 second(s), 72 queries .

    回顶部