QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
9 Y( _; k2 n) l* E- m4 x<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字! G7 l0 |: M1 S  }' z
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
- u! z  |9 h) Z5 R( u* O6 ~是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
0 E! R  t/ S4 w6 J% w% X% t0 w/ x,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
. R+ a) c1 J- c& |6 L- f  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面1 ^" G& y% Y$ W
我给出一个例程供大家参考。</P>  p* [8 L1 W% d% a; [6 l# s
<>
: O, b; D. x8 h, ~& D  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>2 a8 `. r& W2 c3 @( }6 \
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
0 u8 V6 r2 Y) K$ Z单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
6 s" G9 H' L) V! t注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/; U' D/ k% B, I3 p- t* N% ^
void __fastcall TForm1::Button1Click(TObject *Sender)4 l7 |: t1 n1 ~9 J0 j6 R- K$ l
{
* [* X7 Q7 w; ]# G- @( d9 p) ]# @9 ?        int nLength=Edit1-&gt;Text.Length();& X: s3 V, C- f: F7 t8 [
        if (nLength==0)
& S6 |9 R7 g6 I! n: P9 C7 }1 [                return;
! @. R7 [+ M9 P1 f. a        AnsiString str="";% p6 i$ G+ ^7 @( h# i% ^6 A! V* j  i
        char *cTmp=new char[nLength+1];! q! v% Y. F+ F- M, ^! i, U' j
        StrPCopy(cTmp,Edit1-&gt;Text);
7 v$ Q% x1 a& g, X: L8 i        BYTE c1,c2;: ~; y; B# A$ e. q' I
        int i;
8 c/ e, B  S& N' x        for (i=0;i&lt;nLength;i++)7 h5 ?& N- B: X. j- a& \
        {+ k8 H  x$ L$ z" X3 _  C( t. i
                c1=cTmp;. F- f' _0 w; U4 m: D+ I! m) K
                c2=cTmp[i+1];
& s. W" M% `: }1 ?- h                if (c1==163)//判断是否为全角字符. e& l2 t' y8 A# a& Z
                {</P>0 {" n; X+ p0 C5 a
<>                        str=str+AnsiString((char)(c2-128));
3 _9 U' b- u% R0 d. S) }                        i++;
$ d' K0 I* @% b                        continue;4 T! q. W2 {/ q1 W) |
                 }6 \0 T! }3 E5 P6 Y. l# w! v9 j
                if (c1&gt;163)//判断是否为文字
; }- S- Z( A1 L2 z                {</P>
0 w+ D' a( s- P$ G/ V7 N<>                        str=str+AnsiString((char)c1);
' M  t  p: d& P) h% R                        str=str+AnsiString((char)c2);
/ v. I2 u  c' ^, r8 Q                        i++;& \' M0 |/ [1 Z1 l+ Q; N! V3 i$ n
                        continue;2 Q" D1 j; \7 S
                }' r: ^6 |0 `0 y/ m, a& W/ J( y" ^9 n
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理6 @' f. o' C0 a" N) c, i2 ]
                        {! b5 \! K! l+ f$ T: X
                                str=str+" ";8 O2 u9 O" w5 ^- p
                                i++;
1 g5 P& ?8 m! g/ A. \3 A& d! `                                continue;
9 u: c: p( B* k8 T" c7 }; ^                        }) `% ~* l2 k. n+ y
                str=str+ AnsiString(char(c1));
) d, B( b: |1 V        }% M: I. a8 W8 T, h
        Edit2-&gt;Text=str;$ K! z, E8 i6 \$ O/ k
        delete cTmp;cTmp=NULL;
  h  }6 b4 t3 r} </P>
  q6 f8 P6 h" \) v' z7 |* I) ^<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        ' w5 J8 P' L4 E0 P- d( y% T# E
</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-4-21 05:44 , Processed in 0.362424 second(s), 82 queries .

    回顶部