- 在线时间
- 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>
9 d0 _- ]3 [5 X5 s+ n" @< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
! k% m4 |% O- S* x节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则: Z0 p" p W, f1 R+ i
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163. o4 B H3 I2 j/ ?6 s
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。' v5 f7 ]4 @- q" h
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面1 r( z0 z2 d) f5 X, \
我给出一个例程供大家参考。</P>
4 X& w' d) x5 c9 I) W< >
& c9 }" u: d" m/ Y* F& K0 X, | 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>! b7 R: E. u1 v$ U p
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。 n4 w# u! D& J# o: [( b+ e
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。- i! A F6 H* v2 e" w* ~
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/7 E% O `# \5 k+ @3 s, |
void __fastcall TForm1::Button1Click(TObject *Sender)
* f6 Z1 Z5 u9 r' ~: s{
9 P0 p; F6 x* h3 J! o4 a3 q' m int nLength=Edit1->Text.Length();
5 j' ~0 e5 r7 r- j# w1 f0 A if (nLength==0)- l7 x2 U2 ? }$ Q+ H& N$ W% j0 ]
return;; r1 A' A9 \+ }4 _
AnsiString str="";+ \2 d3 P; M( N$ h! C! o7 p
char *cTmp=new char[nLength+1];
( S; ?* B9 V0 y$ _1 O+ J6 { StrPCopy(cTmp,Edit1->Text);( z! U+ g8 a- Y2 {- J, b
BYTE c1,c2;
$ f* r2 b0 G% b: ?* g3 q int i;7 H ~5 e& S" |9 j- Q
for (i=0;i<nLength;i++)5 b3 _. @$ W0 z0 }6 L+ T" ?
{3 s8 V8 z3 o4 O( L: @
c1=cTmp; l o2 b. A9 v+ d% j* X
c2=cTmp[i+1];
! X( a0 i. m" {/ v% a" j( { if (c1==163)//判断是否为全角字符 c: ~3 o/ ]. P9 Z+ i# e
{</P>" [* Y* }8 e3 d2 ~, S
< > str=str+AnsiString((char)(c2-128));- C, u( U7 w) H. U
i++;- x: p. M0 w( u- {8 d
continue;2 s- }+ C0 B. b) R5 G3 A3 S
}, s4 s4 P6 c# U( W$ m, i1 ^
if (c1>163)//判断是否为文字
7 R7 n% F$ p" j# X* v3 x, Q {</P>9 y6 R1 T! v+ \- e
< > str=str+AnsiString((char)c1);: X% t! W/ z6 O2 a
str=str+AnsiString((char)c2);& A' l/ z3 l+ i2 u
i++;
( T' f; h r& o* s5 ^1 D8 w! N continue; I* Q7 p' ^" |/ w' K
}
9 j) H( L# Q6 z if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
3 O9 E7 t# y8 r Z {: X" o9 u' a* C, Q! D) k) t
str=str+" ";
6 x& m2 d( H% L: P6 ]3 R i++;
7 }. `2 }) A0 W+ l continue;
& q8 f7 |( q6 ?( M$ q1 o+ Y5 D }. X) X% B+ [8 g4 U
str=str+ AnsiString(char(c1));
" n' P) y; v- v# u, L. r }5 E6 |, M+ ]1 }6 W+ Y
Edit2->Text=str;4 U8 o3 P% z# Z+ Y* ]/ ^5 y. D
delete cTmp;cTmp=NULL;
" |' Y g$ I/ r& r} </P>" S* c' e4 T+ M6 D6 b/ C/ P
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
) `0 u( W* @8 R. F+ {</P> |
zan
|