QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
( U3 w2 j( G$ W. Z5 U' L3 Q% P% v<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字( u- ?: u9 S, F- u/ r2 w& d0 X' E) y
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
- |0 B0 j9 j+ l是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1631 J* U" v8 E* N% k
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
( l3 B1 J/ ]( J  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面- M: H" Q2 N/ T( F$ S
我给出一个例程供大家参考。</P>
( z  w( O& {/ v<>
% ~" B' ]& T0 h& o2 }& h  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
1 R5 n3 n: ~, j0 K' f<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
9 o  ~5 {3 i/ _/ S单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。& z! x( H" T$ W( Q, X9 L
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
, _' s/ C0 u& w, g0 H! Q/ U7 Gvoid __fastcall TForm1::Button1Click(TObject *Sender)$ V3 F' h2 G3 P# f- E0 P7 I
{
! z( M5 f; T& `" \4 \& c6 L/ v        int nLength=Edit1-&gt;Text.Length();
$ L! ?2 o2 V* g9 E) f        if (nLength==0)+ p# o6 K7 q, y) h  \! a5 A) i
                return;) \+ @1 ]& H9 a6 \
        AnsiString str="";
5 Y/ a6 U% J; a- f2 A. P        char *cTmp=new char[nLength+1];
4 r, V2 K) B( d; B        StrPCopy(cTmp,Edit1-&gt;Text);- t9 k0 w. R! |! H
        BYTE c1,c2;/ G- r2 x, ^- {" i
        int i;
. W( w+ `& s9 [) |3 U/ O        for (i=0;i&lt;nLength;i++)
5 c' Y# y# c+ \0 G1 ^, ]2 r* N. m$ D        {
3 z8 A4 o# a: h" V0 ?2 y) @" |# M4 P                c1=cTmp;' c# a4 U' z7 V8 I+ m" ^
                c2=cTmp[i+1];
% z8 O# a8 p1 c1 }( @* j* W. z/ i                if (c1==163)//判断是否为全角字符
5 g: b; o$ o7 G% s/ q, n3 D                {</P>$ I7 k" q7 l+ `6 H7 Z4 G; }
<>                        str=str+AnsiString((char)(c2-128));6 ^  B2 q  b8 F7 S! v% S$ `
                        i++;
: e" ^4 C, q- E4 C5 v: k8 E                        continue;5 ]. v, B/ J+ p) b
                 }
9 b" J$ ?4 I( U0 @0 Q& p                if (c1&gt;163)//判断是否为文字
' ]7 F- M  N% m                {</P>
& E0 t& O# Q: F5 U4 x) \; H- N7 e2 T6 B<>                        str=str+AnsiString((char)c1);  u% a4 R1 M9 ^( g' e
                        str=str+AnsiString((char)c2);2 m: T! ~) @) N) Z* R
                        i++;% d8 _  @; s$ s# x2 Y+ K
                        continue;
2 n" d0 J! r' P* X                }1 C* z; ]0 s, C; m$ [! H2 ?
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
7 Y( [) k# v6 D4 s6 I                        {
) u3 m% f2 q* g0 V' B3 a; i                                str=str+" ";
; w/ m8 M) W' V; N6 T, o  m                                i++;
# E. n6 k- u3 B( {6 n: M                                continue;
/ q' r. L( `, M2 S                        }3 m" _, s, N9 k, C4 f& i
                str=str+ AnsiString(char(c1));
1 Q! F: v: j  R4 F3 B) D# j        }0 o  b3 y; H% t8 Z  ~
        Edit2-&gt;Text=str;
$ X" a3 \' C' R& k, ^0 \8 Q7 G        delete cTmp;cTmp=NULL;
$ r& z6 \& N0 R, }$ Y4 u} </P>; C% v# u5 }( U, B6 W/ i* \' Z
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
7 E, _: k( T% D# U& J, M+ z</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-9-2 04:08 , Processed in 0.418492 second(s), 71 queries .

    回顶部