- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0
我的地盘我做主
该用户从未签到
|
<>c++ builder:如何转换全角字符到半角字符?</P>( }+ L. u# \: h; N6 A# k% ^
<> 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字" ~! K% Y" q. z) s- y: @+ A
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则; H& T: }% Q9 E! Q+ o
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
3 a1 t' V5 K6 s# P,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
) u$ Y. D' g4 Q# R9 M# b) c5 w8 g 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
$ v2 }3 Y0 D J# D5 @) r我给出一个例程供大家参考。</P>
; J d) I; h1 Y9 r1 A<>
' A# d; Z. X8 g- u: X4 t2 ^ R V* z! V: k 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
( {; l& Q/ D8 s8 t( R/ }; c. c<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。, a5 |# l' O. @; z& X5 N) [
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。 S5 Q( W; e9 U+ G3 S' m
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/9 i8 b" D1 ]( h# h6 ?
void __fastcall TForm1::Button1Click(TObject *Sender)5 q6 r5 i. c% _1 q2 l, \9 @
{: D% o* h' J) x3 ^4 T
int nLength=Edit1->Text.Length();
7 q7 J5 S/ P3 o! C+ R if (nLength==0)8 u0 R5 L: V9 l, L" h
return;
- Z- Z$ y" ?: n1 W2 t7 G p! e AnsiString str="";
/ G: }3 @7 c, G8 c char *cTmp=new char[nLength+1];
/ _4 q; a! E) P6 H- m2 U. k StrPCopy(cTmp,Edit1->Text);
" ~0 B! t0 A; i2 m) e BYTE c1,c2;5 S4 v8 u- m3 N5 m
int i;
+ V0 M' L7 I3 T- f for (i=0;i<nLength;i++)
$ r+ R. i0 K2 x/ b {
8 k& x- ]3 z7 N* H4 \- F8 ~0 u/ r* m c1=cTmp;* Y s% w9 ^ v/ r5 I, |4 g, b' w3 X
c2=cTmp[i+1];
M" o9 S) u6 |2 } if (c1==163)//判断是否为全角字符
# p3 g+ r" Q3 Z/ t0 d2 p5 _1 j) A5 Q {</P>- t- y. {3 U7 S
<> str=str+AnsiString((char)(c2-128));
3 u+ H# g% N5 }0 l8 T3 k i++;
8 _5 E5 m' r8 ~' u6 @+ \3 E% X continue;& m+ F' ^6 i$ @% T" x% f
}
2 y) t2 Q" k; K/ g2 o if (c1>163)//判断是否为文字) E) Y& |, }% s/ o
{</P>8 C* l* v5 z7 o: X1 @" d3 D% q
<> str=str+AnsiString((char)c1);
: x# E- n- p# j3 S/ e6 x- } {3 @ str=str+AnsiString((char)c2);! e, d# z4 e: }% n6 x3 u
i++;( C: J2 x6 |( Z( J
continue;2 I$ I5 p0 {7 w5 k* ?& d* t S% k
}4 n* F( c+ ~4 Y0 e! ^
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
+ d" x/ t; I8 H6 w; K {
9 m% F4 I4 c2 ~2 }' K/ W) t! r str=str+" ";
. O! l. |% P; f& i- x/ w i++;
6 y- T; v6 a3 }8 c* b" x continue;0 O3 E A& \/ G2 M- Z
}' p5 |* v7 U' `, h! E2 p. A0 X
str=str+ AnsiString(char(c1));
2 p/ f% ] B6 E, q. L+ j' s }/ o U7 P- H' C* f1 @. n
Edit2->Text=str;& Y& J; X5 e1 V; l; {. A
delete cTmp;cTmp=NULL;% E+ s- E: Z6 `5 Y1 G
} </P>/ S5 z" ?7 Q+ f2 z! `
<> 以上代码C++Builder5.0/Win98 SE下编译通过。
; F9 L# ^: @4 Z" [) |# g9 K& O! h; z</P> |
zan
|