QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>' x. `1 q! ]7 s6 _- ?2 b' o8 K1 ~
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
% e6 d/ B4 L  @- F2 U8 l节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则6 \0 m/ U) J( l" Z9 }
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
8 `' d6 v1 E: ]( H,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。+ O; x. M2 d0 a& g' k8 b
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面2 M2 T; w* K2 U% T/ l
我给出一个例程供大家参考。</P>
* W( r! m7 b! Z) k7 _7 e<>
  F- Q8 u$ ^' m- s  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P># Z/ \& }4 K0 E; s  K
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。. o  j* o+ b; V* z, L
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。* R' h! n  {+ Y0 H7 l
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/: n; T: x4 M6 Z$ H% {! H7 V# N
void __fastcall TForm1::Button1Click(TObject *Sender)
. u7 P- |/ |* p, H' D5 ?( Q{
3 s; N3 b% E! ^/ r7 X5 E; @        int nLength=Edit1-&gt;Text.Length();- c  F# A8 H% O* Z0 K
        if (nLength==0)
# q& M3 g: ]) R                return;
% {- O# _  t% m8 P$ K, y: d        AnsiString str="";
7 [  `# p4 C- V+ k$ G! E        char *cTmp=new char[nLength+1];
$ `- q! |3 Q5 s3 R- v        StrPCopy(cTmp,Edit1-&gt;Text);
2 B# E* Y! h4 ?- n2 ^5 [        BYTE c1,c2;( I* \; [- M% Y7 U
        int i;* s+ M4 _& _9 l! R6 r! S& r$ |' E
        for (i=0;i&lt;nLength;i++)+ Z' D' F9 w  \! E) P  s
        {9 P9 h  A4 w+ h# v" K; h( g
                c1=cTmp;: e1 ?: g5 J3 @& o$ _# Y8 u
                c2=cTmp[i+1];
) l* T0 C, Z0 S" p# Q                if (c1==163)//判断是否为全角字符
! d+ l/ x4 ]7 l( _3 R* O                {</P>$ ~4 i9 p5 |4 D( }2 Y3 k5 w
<>                        str=str+AnsiString((char)(c2-128));
. R3 X$ n: X9 s  t. K+ v1 d$ G, q                        i++;' |0 `) ^) F, j- U6 D/ f
                        continue;6 _# x0 ~  J7 |9 ~. D7 O# I/ V
                 }
/ Q, O0 g% V0 {  q6 n* r                if (c1&gt;163)//判断是否为文字
+ O9 g* M8 `1 q/ |' K# N                {</P>& ?" O8 t* p  F2 `6 Y* l
<>                        str=str+AnsiString((char)c1);2 J& h2 j* v7 O* ?& Z" r
                        str=str+AnsiString((char)c2);
/ L$ x; N- T" ?* C! ~1 _! b                        i++;
4 a: A& Q8 J  b+ Y% G5 G& r. N: V8 ]                        continue;, K6 ]' R9 r! g% B
                }+ ~6 ^4 w8 G, @+ f: a+ _& n
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
- e! r' l" _% m( j9 g$ o                        {
2 }3 U' b: A& v. [- r" `                                str=str+" ";
8 O! T3 Y  T3 T) d! e                                i++;7 J7 k1 F1 H; t" I2 h% K
                                continue;
' Q$ s' S2 w% S; |% y                        }  _: h- O2 |3 C8 p8 p3 a
                str=str+ AnsiString(char(c1));* f# m  [6 b' @9 S2 V
        }
" H, U6 o6 [! {8 V        Edit2-&gt;Text=str;( d5 g! n5 I# n3 H+ M+ ]
        delete cTmp;cTmp=NULL;! P& k7 A- Z/ m0 N$ K  ~
} </P>
( v: W4 `0 S4 g( x& B<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        ' u, x& g* j* |( h7 @
</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-20 10:44 , Processed in 0.424909 second(s), 82 queries .

    回顶部