QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
#
发表于 2005-1-26 19:31 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>, w) f: I: Z0 }
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
& L; C7 X& E1 L, B7 i# S( n节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则2 w' |5 q' y5 T7 Q
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163: v4 H' `. s4 D
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。5 y1 S' i5 Z5 _
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
% P" p/ S' h: M1 c* j2 M2 n: U' P$ c我给出一个例程供大家参考。</P>
/ d/ h6 W5 ?" p9 D<>
- |! t) R) g; M  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
2 x) D/ h+ D) _- d- s, ?<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
* |1 |* d0 }4 C/ w6 G$ r. }单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
. [3 l# w4 j. U注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/; x( x5 P) R4 |4 m
void __fastcall TForm1::Button1Click(TObject *Sender)
* b/ L9 w. a% q" M{
" w) E- j+ U- K+ v; b: W        int nLength=Edit1-&gt;Text.Length();
: b& `+ w: Q% C: q; }6 u1 Z+ r        if (nLength==0)
. v5 O  p3 v' `' `                return;# h3 V- k/ W" w1 X0 O: I. L
        AnsiString str="";
; e* b/ \- e& w# w5 S        char *cTmp=new char[nLength+1];, G+ \5 ]- ~- @6 P; b: L
        StrPCopy(cTmp,Edit1-&gt;Text);
  t5 k6 J, Y/ i9 A' \        BYTE c1,c2;
$ U! p5 q! B- F1 @% |/ Q, }        int i;
; u  A* A5 x5 j1 s        for (i=0;i&lt;nLength;i++)+ E1 \  d% [0 A# e7 U- F* ?
        {
6 D' d1 ]# l; ^# _2 o5 R8 K' R8 O" i) D                c1=cTmp;
+ _& p# c: e# Y( Q( D/ e                c2=cTmp[i+1];
: B& J6 L4 R3 m5 t" }                if (c1==163)//判断是否为全角字符
% n2 ?  _+ _# l9 Y8 q6 {+ M                {</P>% y4 U* m: m  Y* w
<>                        str=str+AnsiString((char)(c2-128));8 G& M8 {9 j. p& X
                        i++;
5 d+ A: M5 u4 z# f3 ?$ u6 i7 L                        continue;
0 l+ w! h# F; h! h. W; m                 }: A1 E: q& |6 P2 {' @
                if (c1&gt;163)//判断是否为文字
& q8 c7 P7 z5 q" e6 i8 j5 j                {</P>
9 o0 Y$ L$ U# x& ^2 d<>                        str=str+AnsiString((char)c1);
( N6 T6 A6 q( S3 `. `4 S7 b/ L                        str=str+AnsiString((char)c2);
8 @8 Q" J* l( p8 ^                        i++;
6 ]+ I1 x$ f- Z* \% ]" n: F( T& M! A                        continue;. c9 @7 w  q+ x; G! W" g: L- \
                }
3 a, a! d7 W, H3 E' Q                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理2 j) y1 g/ i9 f& z
                        {
1 q+ h* V- m  [1 C1 Q# r' K! {# b                                str=str+" ";- U) u9 R% l3 {, M4 F  J
                                i++;
# t6 U* `# Q+ O" T, K1 z                                continue;
- t; c, c0 @1 Q4 x, p) i% c                        }" v! \7 n! C3 @7 j: g
                str=str+ AnsiString(char(c1));
( j# K- E4 L; V# L' ]        }% v: o1 Q" y9 R
        Edit2-&gt;Text=str;
: T+ Y/ e& F% K; o  R: D% {2 p7 h9 `        delete cTmp;cTmp=NULL;
6 n! h1 a; Y0 q  J( p3 H$ T3 G1 F} </P>+ A. b: k% {% h# f, v, ?
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        / M& B* F5 L+ Z4 N' ^
</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信

4

主题

3

听众

656

积分

  • TA的每日心情
    开心
    2011-11-21 14:38
  • 签到天数: 41 天

    [LV.5]常住居民I

    群组数学建模培训课堂1

    群组数学建模培训课堂2

    群组2011年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    毛冲届        
    头像被屏蔽

    0

    主题

    4

    听众

    20

    积分

    该用户从未签到

    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    bllr.net        

    0

    主题

    0

    听众

    8

    积分

    升级  3.16%

    该用户从未签到

    自我介绍
    QQ个性签名
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-19 14:33 , Processed in 0.495286 second(s), 74 queries .

    回顶部