QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
1 }* |, c5 ~; L6 u6 a<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字  p: g) b& Y5 l0 J( S3 _
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
7 _9 V# M+ N" o4 `& N* Q是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
9 j+ v. J. |/ Q- t,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
' O% E: q( v2 y# Y8 _( K; Q  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面, T5 j- x  s" E1 ]1 ?+ p- T7 T( E! O
我给出一个例程供大家参考。</P>8 c, F+ V1 W; J
<>, z. r' N" }( t& b, B4 M
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>6 @. G$ T; M( z0 s& q' j2 c) z
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。, n( M! O" j" x) N& U
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。4 E3 @8 |5 P" L7 R( a, _
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
2 b4 F. D0 Z  jvoid __fastcall TForm1::Button1Click(TObject *Sender)3 _( U% f* A+ H: W/ [9 c
{3 w1 ~# a# m1 ~: f; w% d
        int nLength=Edit1-&gt;Text.Length();9 Z; o3 z$ s5 ^' |$ j6 L# o
        if (nLength==0)
, ^. `5 H! e3 g. [+ e2 [2 j                return;) A# s! X  P5 y3 A. \2 X5 q% {
        AnsiString str="";% f/ L% K8 }9 c, F" |
        char *cTmp=new char[nLength+1];
- h8 @/ |# y: E. y( J        StrPCopy(cTmp,Edit1-&gt;Text);
, R! i% K; d; D9 p7 ^" j        BYTE c1,c2;8 L# ]6 _6 D% C$ Z6 v2 K
        int i;; C$ e, v" J% H6 z0 `3 Q
        for (i=0;i&lt;nLength;i++)5 i2 z* U% Q4 z, ?
        {
/ u# ]+ [4 T7 t- v* h& L- M' ?+ X                c1=cTmp;
" X5 y; _& M( u) p9 t& g                c2=cTmp[i+1];3 o4 i  e' E9 O) }
                if (c1==163)//判断是否为全角字符/ }, x9 J" l3 m
                {</P>' [! e7 _2 g, y- L
<>                        str=str+AnsiString((char)(c2-128));" n6 ]9 U2 [8 M2 v. j
                        i++;1 m$ g, R% k) T- I- C  x, b
                        continue;
. R. u' ?! t' h. B1 z. e( J( _                 }/ v* v5 E5 Z6 I5 m! a; z+ F
                if (c1&gt;163)//判断是否为文字
% ^5 y  I! t8 ~                {</P>
/ @; [4 I# h; m4 h<>                        str=str+AnsiString((char)c1);
+ b" W' b) w: D% m! f# }* O                        str=str+AnsiString((char)c2);
4 U' t! j, x" O, L7 Y6 S) g                        i++;
& Q# S. R: a/ j                        continue;
/ Y& ~! a! Z# m0 N7 l" ?+ a                }8 s6 y2 _% M4 h3 x: N. K3 P8 `- L
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
! i1 n) c  F5 x! o( d                        {/ [) B0 C1 f! L, e+ h/ c: M
                                str=str+" ";8 L+ n9 S% M2 ~% K  T4 b) `3 m1 T
                                i++;% p7 l0 n7 v' c, ]& i
                                continue;% E- b/ v# Y# C+ o
                        }
! {8 S6 |; n  y' @$ s) p                str=str+ AnsiString(char(c1));
+ x! A1 C% q5 d        }' }. U) @# x0 f5 m0 d- m) K1 t
        Edit2-&gt;Text=str;  z! x  E. b: Q3 P# w/ ]6 S
        delete cTmp;cTmp=NULL;
* j+ A0 `! P: l- E1 O} </P>
. U& y5 o! R  t/ n<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
# f. B& Z/ q8 s) W2 C! L</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, 2026-4-19 07:52 , Processed in 0.375308 second(s), 82 queries .

    回顶部