QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>' D' h: a4 ?; _7 R
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
4 V! z3 K: K6 \8 v节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
# s3 p5 k/ S2 e  O$ ?/ p) _: ^* m是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163  v( J9 u5 R1 J7 U+ b
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。0 l1 j9 p0 Z" C3 }2 ]8 p
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面  y1 ?  q1 V% ]! x- _, {
我给出一个例程供大家参考。</P>7 [8 N8 j( B- c: [& V( Q0 n# h
<>3 h8 _/ P& c! `- V/ W
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>9 W$ K* G: D) J. D5 J+ ?1 J  i
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。4 ?+ \# d1 ~: ?" Z4 c; [0 t7 }- K0 {
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
/ r% [# H& e1 d$ @4 ?# X% h注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
& r: G' z8 o& e8 B: Vvoid __fastcall TForm1::Button1Click(TObject *Sender)% M- X6 B+ {2 Q2 ?
{
; m* I. j* D) c4 o  D4 ]% k        int nLength=Edit1-&gt;Text.Length();3 W8 h( e! x$ V  a! N- E3 R
        if (nLength==0)
4 f' h0 U) \% i. \, R" B                return;9 K1 \! @- a, |8 {! ?1 G
        AnsiString str="";: }* w3 p2 P  y- E/ C9 ~
        char *cTmp=new char[nLength+1];+ ?2 j# b) m9 {$ Q# ^" _8 f& k" @. W& h
        StrPCopy(cTmp,Edit1-&gt;Text);
" w; L9 m$ g! a0 c* g        BYTE c1,c2;
# i* C1 l% Z' u+ ?  l3 @+ p- o) x. e        int i;
' z' _- j/ Q: S  P! U* h        for (i=0;i&lt;nLength;i++)/ N2 [" {( E( @
        {- I( H4 J4 g0 ]# G2 K
                c1=cTmp;
$ Y+ I- W) d- N# J* l                c2=cTmp[i+1];
4 ^- J" g) ^( [3 t# P* ?                if (c1==163)//判断是否为全角字符
1 ^. N. V& D, A& Z- k                {</P>
# p/ Y5 X% a$ a/ S; u- k<>                        str=str+AnsiString((char)(c2-128));% z' I! F) h' p0 l
                        i++;# v& n7 F5 N0 q+ `) M5 B
                        continue;) W4 T" j" ^5 f: q9 M* c
                 }
! P; W% L! I7 o/ U, @! V                if (c1&gt;163)//判断是否为文字
( x: b" y2 Z6 u4 o                {</P>
* k$ V: y' Y9 S6 n: W! {<>                        str=str+AnsiString((char)c1);
2 n8 R1 P5 u; ], T                        str=str+AnsiString((char)c2);1 Q% E# X9 p2 c8 Y" c& j1 g) _% k
                        i++;
* U- L; B# W1 }* d                        continue;, W7 a- A! f- d1 W9 Z# O, U, r6 r
                }
& S7 x9 S4 s7 c, o7 S                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理% P4 P' E$ k; t8 u6 s
                        {0 ^# u8 @" v0 Y9 F, h
                                str=str+" ";  q1 ^9 b+ ?  ?! c6 D7 `& w: x' j& b" ~
                                i++;
2 N, A# R0 I" u2 i( N                                continue;6 `: P8 {* X, e
                        }6 {, y+ z; B) M6 ?$ d+ g* I
                str=str+ AnsiString(char(c1));
: N& f6 X1 L: m& _2 E1 w0 M. k1 z4 W        }
  }8 ?' v  R+ v2 l        Edit2-&gt;Text=str;$ o- a. }0 ^; d" N' n* n
        delete cTmp;cTmp=NULL;
& C5 r+ V5 \, l9 Y$ I7 H; {} </P>
3 b" `2 z7 E! ]9 Q<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
1 d) P- K/ X- p% `5 Q( c, o/ c</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, 2025-11-10 18:45 , Processed in 0.538595 second(s), 82 queries .

    回顶部