QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>" S/ R( j3 Y) E  @
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
2 h7 G8 K) N; N, q0 v5 l: y$ H节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则! p# v8 l# x5 P3 i9 D9 U1 q0 M
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
) _4 a( e- M3 A,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。; l" y; K. \# J6 r
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
, i$ @7 F* v6 d. Z  b+ G我给出一个例程供大家参考。</P>
2 `  m- e$ D& b& ?# }<># @" g* W  u: @0 C
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
" J7 n0 A9 [4 q: b# G& e2 q3 }<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。9 \$ B& s4 e6 h) o* i
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
2 x' R1 p: j, z" \; t) h0 ~! C注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/. G1 Z) w* C6 o' Y. D+ `
void __fastcall TForm1::Button1Click(TObject *Sender)
7 H* L( Y# v" R) ^! R, \! w2 l4 ?: a+ w{
+ K, q/ q+ A  n0 Q4 v" F        int nLength=Edit1-&gt;Text.Length();
8 L& I. L% Q: Y        if (nLength==0)
6 k! r- E4 e& v+ h! u6 S  P                return;4 v) U8 p$ Y. D
        AnsiString str="";" k/ R! |. G) x9 f6 f; O, |
        char *cTmp=new char[nLength+1];
9 [* s: f# g+ u8 s8 `- F0 L        StrPCopy(cTmp,Edit1-&gt;Text);
  }" f- g  w& p, J        BYTE c1,c2;
! K! K6 I7 b3 _) K& `0 \+ {) ?; ?6 o        int i;. l; e$ |# f- ~' C. ^6 B
        for (i=0;i&lt;nLength;i++)
' _; S5 W: A+ v1 j, V. \3 Q* o4 x        {* X- L7 J7 h0 L7 T
                c1=cTmp;
9 L! l9 T5 N4 s3 {. ]0 z' R& s9 J                c2=cTmp[i+1];5 t3 t/ O( F7 [9 [& ~8 m2 ]
                if (c1==163)//判断是否为全角字符! s3 N+ j( E2 e/ M) f
                {</P>
, B0 H6 C" @, P<>                        str=str+AnsiString((char)(c2-128));
7 ?. a/ C' w  X* h3 h                        i++;3 L" D& |2 @1 m6 ^; g6 Z
                        continue;
* g' N+ D" p) q% N6 B                 }) P5 c& W) z) y" A2 {+ u4 Y+ }" _
                if (c1&gt;163)//判断是否为文字. x  R  t* t+ d- ~* M
                {</P>  D9 s" o2 g, g- Q- _
<>                        str=str+AnsiString((char)c1);. }  r) ^- ?9 C
                        str=str+AnsiString((char)c2);" K. {( d3 z  }
                        i++;* c: F- Z1 e. ?$ s
                        continue;
0 M0 `8 j1 L% y* M) ^                }
% ]- S9 E6 z3 I4 e  r! b4 \& x% J                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
: g7 }3 A4 ^. N5 S8 y" _                        {( B. y- J, ^1 f: Z: T  _
                                str=str+" ";. K0 M7 Q; @5 K
                                i++;% a0 ]5 P  J) c" c
                                continue;
- {; U6 I: T- _; U' i4 a/ Z3 Q! C                        }* }# x# C9 P! n; e- D
                str=str+ AnsiString(char(c1));* `  Q1 A/ n) ^/ C( T
        }
2 m! f9 l; v, E% E. B5 D+ P* t3 `        Edit2-&gt;Text=str;' c/ m. X4 ?" i8 r/ j
        delete cTmp;cTmp=NULL;
8 i5 b# Y, e3 p0 m5 u, s3 i} </P>
( S# }& ]5 F4 v6 n' |<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
% ]1 L0 s1 E+ N8 ]</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-17 10:17 , Processed in 0.488247 second(s), 81 queries .

    回顶部