QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>/ u0 p* c8 C3 P1 W  b& E6 w
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字" y& Z7 w; o7 [5 T" {
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
7 n6 o8 `& h$ b+ f" X7 m是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163) A. Z# {9 N9 k8 I1 E% x" }; R1 e
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
3 N" ]* j, Z: _0 a9 W  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面  r" g6 u& R$ t. b+ n1 p
我给出一个例程供大家参考。</P>
' S0 C3 f0 U% ?8 H$ A; l" X& k<>
: M9 Y) R' R3 r, T  x) _! g; U  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
% Z; y7 i6 s' d( @" R8 v<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
' J' ^; i% f& `单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
/ G9 R) [+ I7 R. E注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
2 C% i1 L! f- Q' Bvoid __fastcall TForm1::Button1Click(TObject *Sender)' m( E* |0 u- b1 m
{
( Y* @- L8 ?: W- a. K; G        int nLength=Edit1-&gt;Text.Length();  \, u. G1 S) t; s# \  Z" s
        if (nLength==0)2 V% k7 Z+ X1 \0 A' ]. Y3 j9 a
                return;
& t: m% l: o8 i0 u" P( d        AnsiString str="";. Q/ P. M& _! y4 g/ _$ I
        char *cTmp=new char[nLength+1];
, d9 S, `$ L4 f        StrPCopy(cTmp,Edit1-&gt;Text);
* W& V) S$ [- m; O        BYTE c1,c2;5 r& T1 y6 Y2 K+ l" f
        int i;
; Z, o; ]- F4 h) A6 T) u4 C        for (i=0;i&lt;nLength;i++)
, Y: P' Z0 _+ e7 a7 D- B5 C/ i* @        {& x2 Q% I+ S0 F
                c1=cTmp;
: O+ y7 f  l: H6 F7 l                c2=cTmp[i+1];  a) D1 \6 R7 ~0 U& j% T
                if (c1==163)//判断是否为全角字符. o2 D4 o/ `3 [! |: m  a( e2 t
                {</P>
8 q4 G2 f) u1 j9 D. z" g$ B5 ]4 i8 S<>                        str=str+AnsiString((char)(c2-128));
0 L) C8 p! {$ J1 k  l1 h, Z                        i++;
  a2 H/ d6 ^' ]" G+ n- A1 l                        continue;
  d$ i, L$ T$ ], ^7 v                 }  x8 @2 N2 Z9 q( ?$ k
                if (c1&gt;163)//判断是否为文字: I1 Y( F' a% F1 G" j
                {</P>) |7 q5 N# E. j+ ]. {
<>                        str=str+AnsiString((char)c1);
, j! @! h' z( t                        str=str+AnsiString((char)c2);
1 k) B9 [8 k. G# z, A" i                        i++;& z/ i: t4 k0 h& h2 C/ a: ]0 {
                        continue;
3 S$ A2 Q, u$ ~  m& K                }6 @1 {$ M* N6 x# {+ r
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理9 E. I/ E" ~+ E0 I5 v+ g# P5 `
                        {* S  m3 r& b3 R  b1 e
                                str=str+" ";7 F1 x5 `* `) C
                                i++;
( A  I+ M/ O8 p, e/ S/ W# H                                continue;$ F9 w+ }0 q. ~9 f. [% e" F) b& t& v9 n# W
                        }8 X% _' H! s& j+ G8 }) M
                str=str+ AnsiString(char(c1));
* s" T& S, z: T9 M' P        }
( N( n1 O' ]3 e" v6 s4 u        Edit2-&gt;Text=str;
& k2 X+ j: G3 Y  ~        delete cTmp;cTmp=NULL;
/ {6 j. S8 P9 d! F& ~1 T} </P>
! R7 z5 @, K- Q5 z7 r<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
* }6 Z2 W) f: Y/ _7 K</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, 2025-11-11 00:32 , Processed in 0.605645 second(s), 71 queries .

    回顶部