QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>+ k' n7 ?/ n: R8 E% |9 R
<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字* s4 |1 V/ `6 H3 T! L/ D
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
) C& i3 \! z4 t0 x5 p1 K8 E是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1635 D2 D- G3 y; D. q$ Q+ X
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。5 B  g8 i  T5 i2 S# X0 @$ I
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面$ ~/ {+ R- h0 J
我给出一个例程供大家参考。</P>
* [% V1 K' n; ^8 ^5 ?<>
$ H4 o3 H) w" J* ?: j! s+ F  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>3 D0 d) k- S8 m2 S* r& x
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
0 U0 L! k' C/ P' U单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。) g1 s, H& J7 _' z8 t3 Z
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
8 y4 _! H+ M7 j& b: ovoid __fastcall TForm1::Button1Click(TObject *Sender): H& B/ l# J! x; `) i6 ?
{- h& j9 w  W! c* A: \1 l
        int nLength=Edit1-&gt;Text.Length();
, _, C& \* _; j6 E7 z  |" z  t$ n        if (nLength==0)2 h! `! W; [- E7 {  y2 H9 G
                return;
3 I  D( W# R, w* U5 y7 B        AnsiString str="";& V/ V- @, P8 q2 O0 j1 |0 f* P- R
        char *cTmp=new char[nLength+1];
0 w! D& @, J6 Z8 n& K; A        StrPCopy(cTmp,Edit1-&gt;Text);
8 x& u1 @# R' A, }        BYTE c1,c2;
: b- u0 V6 S8 ?7 t& |        int i;
4 Q( a0 W, M& t9 J4 s" K        for (i=0;i&lt;nLength;i++)2 \+ d+ I  @* ]4 A
        {
0 i# [/ \1 [* Y9 G0 |                c1=cTmp;, L! w' Q) d: e& P1 U- b
                c2=cTmp[i+1];; u% ]  a/ N. [2 @, P) _
                if (c1==163)//判断是否为全角字符
% {" f$ D4 n; b. w( S% c' u                {</P>( l% h* V0 l5 ^6 s8 |
<>                        str=str+AnsiString((char)(c2-128));
; B, J6 ]; }! k. A' E                        i++;5 [; P. C4 e0 k6 v; T2 C' a
                        continue;
' h& m( t0 a6 B) Z. X                 }6 q' N0 O% G6 b/ ?& I' J% q
                if (c1&gt;163)//判断是否为文字2 E* g& H5 e6 N
                {</P>5 E' S5 `. B( ~3 D( J
<>                        str=str+AnsiString((char)c1);
( v2 b, t! x: O, Z                        str=str+AnsiString((char)c2);* Z5 r% }) y4 }( ?* O
                        i++;( K0 `: l% v' s% ^
                        continue;1 I' Y. E# }) U. ~8 y
                }
( B$ w2 {; N9 a  w                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理" L' ~$ b% d8 n
                        {- ?0 P# h: v* |8 X; P
                                str=str+" ";
% I: u- Y+ t8 N9 o& o3 O: S                                i++;
& X( p& C/ L% @                                continue;! V3 _: i' i/ Y5 R
                        }
' L) p. h+ x. H' q% N3 N; I, l                str=str+ AnsiString(char(c1));- k2 J1 x, R3 Y/ ^4 H% s( X  d
        }) ?: I' ?! d* H1 g( Q, I; \- ?
        Edit2-&gt;Text=str;' u$ C1 z* L5 B, Q5 k) }: f; O: p" w
        delete cTmp;cTmp=NULL;
* i; ]! V! X" Y: b* h3 E} </P>/ o5 w) b" C( v8 P: P; _/ H
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
5 ^& i; s: y9 h( I( _+ H# @6 d</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-4-20 11:24 , Processed in 0.463003 second(s), 72 queries .

    回顶部