- 在线时间
- 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>& y* p& Z e" c, B& T; r5 P$ V" K' N2 {
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
( _# y7 V) Y' t1 I, J V. d节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则' K; u2 _( _5 r, p3 F
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
0 w7 G! _( K0 h4 x7 }. L3 }, \9 K7 w,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
% b7 ~& `* N: U. S9 w 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
; s& ?: P: X4 H, r. X1 I我给出一个例程供大家参考。</P>' `3 v- r R, r$ @/ U, J
< >) F6 m$ c: k# {* L' O* I
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>' H" n5 f1 b8 }
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。. Z) `. x3 o( b- |9 r9 Q7 _, d
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。& F4 J. Z4 _; V/ U6 t
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*// P' G( f' D. V( t2 y
void __fastcall TForm1::Button1Click(TObject *Sender)( [8 a+ L& U6 h! I J
{/ }9 b5 ]0 Y# {; e8 A0 P
int nLength=Edit1->Text.Length();2 J' Q- L- H0 M0 E' f8 Q0 F
if (nLength==0)
! r/ m! S4 e0 C+ r, R: I return; o: a& }2 }5 ?) y
AnsiString str="";
/ p4 w8 O; i8 O1 _8 q4 ^' N char *cTmp=new char[nLength+1];! l1 p9 b6 c2 ~7 U! H$ f6 _
StrPCopy(cTmp,Edit1->Text);
3 Q; Q% N7 V+ J0 }) |0 S6 l BYTE c1,c2;7 s* \: w2 L2 @ f8 h
int i;" O( i$ l% a4 U* ^6 ~6 A- X. S/ A! o; c) f
for (i=0;i<nLength;i++)! l. c$ @1 e3 ^ q0 U+ z
{/ H i7 d+ k: d5 h$ g
c1=cTmp;
3 F6 Q4 M# m* A6 | c2=cTmp[i+1];# J1 K. k) T/ a
if (c1==163)//判断是否为全角字符 ]: T% y9 M! W9 J% V: j+ X
{</P># v& G" ^" ]' U3 M! f; y4 V5 ]
< > str=str+AnsiString((char)(c2-128));
6 _7 G) G, D0 a, b4 B# _ i++;) I2 C* p% C5 ^" j* Z' o
continue; i( p9 l! G `% k2 o+ o
}- e# O% R. P. [& ], G0 \
if (c1>163)//判断是否为文字
5 {. @, J* H% X6 Y4 q {</P>
. N8 A* ~. ~/ t, l E< > str=str+AnsiString((char)c1);
5 E1 \% w2 ?: w& p: D" N" g; D str=str+AnsiString((char)c2);
( I3 r8 e/ p l5 b/ R: W0 N2 y i++;0 h1 J0 \+ [0 G9 f
continue;
) N- Z3 [, V# m. A' ^ d) ^ }$ z* I" q D; P$ |) `3 g# F* q
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理% ^+ C5 y9 h3 m
{
+ y6 \6 h) U; z; o2 V# _2 ] str=str+" ";! z5 M2 h2 n1 l# ^; f0 s; O$ s
i++;
) x7 t5 t# @0 W( }9 ^, A- J1 a; p continue;
2 x) k# q4 N Z9 {6 c# I }4 N# x, n4 L* A, `& F; h1 h- C
str=str+ AnsiString(char(c1));
1 Y/ l8 C- m) _ }* H8 T8 ` |2 X: V/ @
Edit2->Text=str;6 H$ v# C# \! ?: r6 x' {
delete cTmp;cTmp=NULL;
% L8 U: Z9 ~1 R$ c8 N8 @} </P>
. ]' ^) b4 Z* k4 F< > 以上代码C++Builder5.0/Win98 SE下编译通过。
1 J6 P1 H2 J$ `+ D! V' L1 V</P> |
zan
|