QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
4 f  d7 u: l7 Z! P9 c  q# O. F' C<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
. q) G$ F9 ^. j" _! G节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
7 t4 \4 U' `8 ?6 `" J! L* b% n. m8 V是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163) O9 D3 Z$ i8 a5 [  b
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
/ ]1 [" [1 j$ j1 p% ~- G* K  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
4 e! d% a# Z$ S5 I# ^4 a4 c& G我给出一个例程供大家参考。</P>, g1 ~# w2 X# I- D# b/ w, \
<>- c" n9 r5 y* C3 V# e; Z+ m; Z
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>) v9 E0 L: @0 h2 m( t) H3 Q
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
0 i# v1 O4 P% e% f- h2 s8 s单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
9 e6 _1 {" B' d2 h注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/5 A" b' u" c0 D! m+ Y
void __fastcall TForm1::Button1Click(TObject *Sender)" T( m! o, d9 g# e- X6 q
{
( d* H8 s1 j. H/ E; G        int nLength=Edit1-&gt;Text.Length();
. Q9 w$ Q/ O- ^3 S+ `. d        if (nLength==0)
! S3 K2 n6 c4 j, _+ H  n                return;
! k4 H. N' p! J1 t) Y/ u        AnsiString str="";
- C0 r( M2 V7 \, F8 t! G* j3 l, F! H" D        char *cTmp=new char[nLength+1];  b) [# y/ e1 s( k5 S2 p4 \
        StrPCopy(cTmp,Edit1-&gt;Text);
  p' B9 L" _4 p" S) {        BYTE c1,c2;$ J% }& P& a8 M6 L! b8 _# @
        int i;5 o% I% K' c, _# ^' L
        for (i=0;i&lt;nLength;i++)
4 z: j  l- o2 ]+ s/ e4 i        {
) C8 E. n# B1 a( N5 }$ }                c1=cTmp;( r; s( l2 |2 _* ~( k+ r
                c2=cTmp[i+1];
% ?" ]" d$ w3 O! Q4 Q# T$ b                if (c1==163)//判断是否为全角字符* r; L) E" H% j+ K3 V/ a2 g! S" C
                {</P>
6 h) c4 P8 W& q) G<>                        str=str+AnsiString((char)(c2-128));9 z4 z' v# [( }/ g- y
                        i++;/ w9 x2 `+ `% p! |9 a; V! [: }
                        continue;
  `* d, @& q. e$ [' \                 }+ s2 \: m6 [- r1 j+ O0 J9 R0 u
                if (c1&gt;163)//判断是否为文字
! Q* d( X2 I) X+ G" w% r8 M; ^                {</P>
0 ]+ Z* s' P  t  b; T7 t9 Q+ K9 ^; @, _<>                        str=str+AnsiString((char)c1);- R) d( X8 ]( @4 G. f% x
                        str=str+AnsiString((char)c2);
' u1 ~2 |( K+ F& A7 F                        i++;5 q9 D0 @# m: T1 G8 U/ q3 f
                        continue;* Y2 D. N+ l  T
                }% ~: H6 T9 o8 K3 N) m
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
# K8 |$ A- Y: J( ?! |6 L                        {
5 B' s3 F9 R4 M; `- E                                str=str+" ";
* k8 O- B# Q  X5 v; m! |; _5 O                                i++;
9 J1 O( ?( r! j) d! ?1 u: l                                continue;7 R* O2 F, b" g2 Y" T+ b
                        }
& j+ N1 y/ @. l/ l0 e. y" x                str=str+ AnsiString(char(c1));# d+ N% B5 X, D' |
        }" J* W3 Z) m4 d/ O. {8 d) b/ z
        Edit2-&gt;Text=str;0 V( d) H) E, j: Y" W; }
        delete cTmp;cTmp=NULL;
# X, `! n, o0 m; k+ R} </P>
; T+ {( R! g7 h5 A/ E, ^9 X' q<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        " z$ h/ |7 c$ H
</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信
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年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-20 18:03 , Processed in 0.465713 second(s), 71 queries .

    回顶部