QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>2 `8 ^  I3 `' L  n( v
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字, m6 p: a' j4 ?5 }0 B
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
5 B, Q2 n* N5 k' {) G& L2 G$ x6 P是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
: X2 J( S: T0 S# f: S: V* Z,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。6 A, y; S5 i! k1 ^, ]
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面6 B2 V9 s+ Y% z/ G) w1 L- N
我给出一个例程供大家参考。</P>0 }3 D. K+ Z+ w* D5 }6 |
<>5 ~6 ]" G) x" @) r! L1 O" d) G
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>. E1 `2 q: t5 k/ @; `6 n( s
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
: N# V( g# E- O& {5 b. W单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。. {4 v, o" \$ c2 W9 s; {
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/  H9 H5 B0 Q" C$ P0 E
void __fastcall TForm1::Button1Click(TObject *Sender)
; _/ t5 }5 a; h1 \/ B/ X{, T) F, v0 l) N+ [! k0 {
        int nLength=Edit1-&gt;Text.Length();
1 v- _9 X5 V7 X8 s( M, G3 l        if (nLength==0)- d6 b8 o  m- a4 @
                return;
, n/ `1 d+ N8 a1 ~, p0 m2 C; X& Y& ]        AnsiString str="";1 A/ S+ v" x4 y# L: j
        char *cTmp=new char[nLength+1];( t1 V8 S' i6 o& V+ l* d
        StrPCopy(cTmp,Edit1-&gt;Text);4 E) N4 m$ f4 B2 _  ~0 m
        BYTE c1,c2;  ^2 V' V3 b2 q7 Q" s
        int i;
; ^: c: Y3 q" y& I        for (i=0;i&lt;nLength;i++)
" K1 P- C+ r; G8 R/ Y4 h) v        {
. U" W+ {  T- M                c1=cTmp;0 h! n- t9 \( E3 b
                c2=cTmp[i+1];
4 B$ M- r: O1 N& l: X3 a                if (c1==163)//判断是否为全角字符8 K: M# H+ f* h; F6 F- f% I! R, q
                {</P>
" S+ O( @' v9 @  d3 f) o<>                        str=str+AnsiString((char)(c2-128));) A; I" Y2 h% b  g3 ^' Z
                        i++;. y' y$ y1 Q& H9 {
                        continue;
+ l7 k( J& Z0 ~, e                 }" S* A/ \; {+ _/ p7 ^! H
                if (c1&gt;163)//判断是否为文字
) t; C+ V' r  ?# g9 U7 a3 I0 R                {</P>; g4 s+ O- }  c8 I' S/ `, W
<>                        str=str+AnsiString((char)c1);9 ^) o( h) h! {; @8 c
                        str=str+AnsiString((char)c2);
* C# t4 d! u+ [2 n+ @& v                        i++;
1 ~3 c! M. g+ `1 G7 A3 B8 k+ l: Q                        continue;
; O7 M% h6 a& H* U  Z                }
" y0 F3 M' a0 Y: l9 z$ `/ |                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
) k" S5 q& S, l                        {: V. f8 I0 I( i5 _; E7 L: b0 V. p
                                str=str+" ";. r% Z" l0 v1 z0 h! M
                                i++;! |+ @0 i+ b+ X, Q0 M. H
                                continue;
8 G3 o9 c, Q" ~" p6 b( r: \8 v                        }- u: N" h) l# K9 \: n$ O
                str=str+ AnsiString(char(c1));) t) v7 a) P5 D. N3 q% c" O$ M
        }
% x" ~' E. J3 H7 E  U5 J9 \. u" M0 f" y        Edit2-&gt;Text=str;
0 S) H& j, Q, L: S        delete cTmp;cTmp=NULL;
, F3 {6 A( `- h, Z5 ^. b} </P>
% G/ j$ V8 i: l+ z8 c3 R<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
$ x; e- y; ?1 J( V</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-6-16 12:23 , Processed in 0.388077 second(s), 81 queries .

    回顶部