- 在线时间
- 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>
( U3 w2 j( G$ W. Z5 U' L3 Q% P% v< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字( u- ?: u9 S, F- u/ r2 w& d0 X' E) y
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
- |0 B0 j9 j+ l是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1631 J* U" v8 E* N% k
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
( l3 B1 J/ ]( J 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面- M: H" Q2 N/ T( F$ S
我给出一个例程供大家参考。</P>
( z w( O& {/ v< >
% ~" B' ]& T0 h& o2 }& h 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
1 R5 n3 n: ~, j0 K' f< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
9 o ~5 {3 i/ _/ S单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。& z! x( H" T$ W( Q, X9 L
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
, _' s/ C0 u& w, g0 H! Q/ U7 Gvoid __fastcall TForm1::Button1Click(TObject *Sender)$ V3 F' h2 G3 P# f- E0 P7 I
{
! z( M5 f; T& `" \4 \& c6 L/ v int nLength=Edit1->Text.Length();
$ L! ?2 o2 V* g9 E) f if (nLength==0)+ p# o6 K7 q, y) h \! a5 A) i
return;) \+ @1 ]& H9 a6 \
AnsiString str="";
5 Y/ a6 U% J; a- f2 A. P char *cTmp=new char[nLength+1];
4 r, V2 K) B( d; B StrPCopy(cTmp,Edit1->Text);- t9 k0 w. R! |! H
BYTE c1,c2;/ G- r2 x, ^- {" i
int i;
. W( w+ `& s9 [) |3 U/ O for (i=0;i<nLength;i++)
5 c' Y# y# c+ \0 G1 ^, ]2 r* N. m$ D {
3 z8 A4 o# a: h" V0 ?2 y) @" |# M4 P c1=cTmp;' c# a4 U' z7 V8 I+ m" ^
c2=cTmp[i+1];
% z8 O# a8 p1 c1 }( @* j* W. z/ i if (c1==163)//判断是否为全角字符
5 g: b; o$ o7 G% s/ q, n3 D {</P>$ I7 k" q7 l+ `6 H7 Z4 G; }
< > str=str+AnsiString((char)(c2-128));6 ^ B2 q b8 F7 S! v% S$ `
i++;
: e" ^4 C, q- E4 C5 v: k8 E continue;5 ]. v, B/ J+ p) b
}
9 b" J$ ?4 I( U0 @0 Q& p if (c1>163)//判断是否为文字
' ]7 F- M N% m {</P>
& E0 t& O# Q: F5 U4 x) \; H- N7 e2 T6 B< > str=str+AnsiString((char)c1); u% a4 R1 M9 ^( g' e
str=str+AnsiString((char)c2);2 m: T! ~) @) N) Z* R
i++;% d8 _ @; s$ s# x2 Y+ K
continue;
2 n" d0 J! r' P* X }1 C* z; ]0 s, C; m$ [! H2 ?
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
7 Y( [) k# v6 D4 s6 I {
) u3 m% f2 q* g0 V' B3 a; i str=str+" ";
; w/ m8 M) W' V; N6 T, o m i++;
# E. n6 k- u3 B( {6 n: M continue;
/ q' r. L( `, M2 S }3 m" _, s, N9 k, C4 f& i
str=str+ AnsiString(char(c1));
1 Q! F: v: j R4 F3 B) D# j }0 o b3 y; H% t8 Z ~
Edit2->Text=str;
$ X" a3 \' C' R& k, ^0 \8 Q7 G delete cTmp;cTmp=NULL;
$ r& z6 \& N0 R, }$ Y4 u} </P>; C% v# u5 }( U, B6 W/ i* \' Z
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
7 E, _: k( T% D# U& J, M+ z</P> |
zan
|