QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>& ?& I2 i4 p# b4 w4 N/ G/ x
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
4 }! O( f* ?1 _节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则9 ~: T( v( d" T: Z5 t' @* _% b
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
0 c1 k. H* C# P, n; D+ a5 _7 },(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
) w. g8 k5 k" w& Y  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
. Z- ^, o. \, p, ^2 g0 }" ?3 ~我给出一个例程供大家参考。</P>
1 x& `' l, u, |8 F9 Q8 m8 P<>
0 g4 T# V9 M& Q1 m% U) i0 v8 o  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>! E0 g+ r# S% {4 Y. ^0 }3 p
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。$ K& k$ O5 w- R7 [. r1 d
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。3 t) p5 j" O, g# w
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
! S: `# [! B, B- G8 Pvoid __fastcall TForm1::Button1Click(TObject *Sender)
: o+ {; N/ `! W# b% E0 Z{
) i2 N* q8 m0 m        int nLength=Edit1-&gt;Text.Length();
3 [0 \' j. T' O7 ]7 i/ j( V        if (nLength==0)* K3 g: R, e5 U) p$ s; w4 w
                return;( }- L9 A6 T: b4 @+ U
        AnsiString str="";
1 N5 m/ o, l- {  W        char *cTmp=new char[nLength+1];
0 D" @0 d2 R# Y" ~$ ?4 a  }        StrPCopy(cTmp,Edit1-&gt;Text);
( N/ t7 o- E6 v, C3 w3 s# Z        BYTE c1,c2;
2 L/ B# ?, E2 N) b. D1 ^% X        int i;/ d8 s9 q* F) {: h- C& k: g+ ^: x
        for (i=0;i&lt;nLength;i++)3 q7 s- _! G. j/ C& E
        {
3 Q4 M3 u+ L& h' g# _/ @6 v2 |                c1=cTmp;$ q  z3 O8 v+ Z( P4 O$ [
                c2=cTmp[i+1];, Q3 ~, n. c# _
                if (c1==163)//判断是否为全角字符
5 D+ ^1 g2 k! s! I                {</P>7 S& l/ ?' b9 V( L; A6 i6 x
<>                        str=str+AnsiString((char)(c2-128));# W+ A/ m' @3 ?% {$ ?4 m4 Q
                        i++;
7 E: D1 X: f$ Q                        continue;
! A  [3 b: I% {$ \* [                 }
% ~5 l2 g: G7 }2 [6 M8 O% |' f! b                if (c1&gt;163)//判断是否为文字# e0 N$ u8 x; E9 N' r- ]
                {</P>
$ x1 y" W3 Y$ T# K( V- C* p: }9 t<>                        str=str+AnsiString((char)c1);0 f7 c7 V0 p% Y$ \! J1 B; n
                        str=str+AnsiString((char)c2);7 D6 A) O& G! V- F* \# i
                        i++;
1 f) J9 k0 a) B' ?                        continue;
+ |9 J8 Q+ \) V7 ]8 U- e                }
- d& q' n0 B4 T& n9 F5 B7 P                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
0 E& k3 E0 Q' @( `! d& A                        {
+ ^  w6 z8 A% G. Y# x8 E                                str=str+" ";
  Q9 ~! O' P8 d4 Q$ L# j                                i++;- a/ U6 V* A" V; v& J, ?0 b3 ^( i
                                continue;" G5 D; I# f! J
                        }7 v3 Q) |6 z) g4 P3 O
                str=str+ AnsiString(char(c1));
' D: k' u  `) e        }, d) a  E! a2 r2 e7 N
        Edit2-&gt;Text=str;8 C% @: {- ?: Z9 k+ T" \
        delete cTmp;cTmp=NULL;
& V  ?7 q# E: L} </P>0 U& D3 i9 g7 j: ~# C
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        ( \) G3 v( x- H& w
</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-9-1 09:36 , Processed in 0.732127 second(s), 81 queries .

    回顶部