- 在线时间
- 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>' D' h: a4 ?; _7 R
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
4 V! z3 K: K6 \8 v节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
# s3 p5 k/ S2 e O$ ?/ p) _: ^* m是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163 v( J9 u5 R1 J7 U+ b
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。0 l1 j9 p0 Z" C3 }2 ]8 p
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面 y1 ? q1 V% ]! x- _, {
我给出一个例程供大家参考。</P>7 [8 N8 j( B- c: [& V( Q0 n# h
< >3 h8 _/ P& c! `- V/ W
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>9 W$ K* G: D) J. D5 J+ ?1 J i
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。4 ?+ \# d1 ~: ?" Z4 c; [0 t7 }- K0 {
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
/ r% [# H& e1 d$ @4 ?# X% h注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
& r: G' z8 o& e8 B: Vvoid __fastcall TForm1::Button1Click(TObject *Sender)% M- X6 B+ {2 Q2 ?
{
; m* I. j* D) c4 o D4 ]% k int nLength=Edit1->Text.Length();3 W8 h( e! x$ V a! N- E3 R
if (nLength==0)
4 f' h0 U) \% i. \, R" B return;9 K1 \! @- a, |8 {! ?1 G
AnsiString str="";: }* w3 p2 P y- E/ C9 ~
char *cTmp=new char[nLength+1];+ ?2 j# b) m9 {$ Q# ^" _8 f& k" @. W& h
StrPCopy(cTmp,Edit1->Text);
" w; L9 m$ g! a0 c* g BYTE c1,c2;
# i* C1 l% Z' u+ ? l3 @+ p- o) x. e int i;
' z' _- j/ Q: S P! U* h for (i=0;i<nLength;i++)/ N2 [" {( E( @
{- I( H4 J4 g0 ]# G2 K
c1=cTmp;
$ Y+ I- W) d- N# J* l c2=cTmp[i+1];
4 ^- J" g) ^( [3 t# P* ? if (c1==163)//判断是否为全角字符
1 ^. N. V& D, A& Z- k {</P>
# p/ Y5 X% a$ a/ S; u- k< > str=str+AnsiString((char)(c2-128));% z' I! F) h' p0 l
i++;# v& n7 F5 N0 q+ `) M5 B
continue;) W4 T" j" ^5 f: q9 M* c
}
! P; W% L! I7 o/ U, @! V if (c1>163)//判断是否为文字
( x: b" y2 Z6 u4 o {</P>
* k$ V: y' Y9 S6 n: W! {< > str=str+AnsiString((char)c1);
2 n8 R1 P5 u; ], T str=str+AnsiString((char)c2);1 Q% E# X9 p2 c8 Y" c& j1 g) _% k
i++;
* U- L; B# W1 }* d continue;, W7 a- A! f- d1 W9 Z# O, U, r6 r
}
& S7 x9 S4 s7 c, o7 S if ((c1==161) && (c2==161))//全角空格是个特例,另加处理% P4 P' E$ k; t8 u6 s
{0 ^# u8 @" v0 Y9 F, h
str=str+" "; q1 ^9 b+ ? ?! c6 D7 `& w: x' j& b" ~
i++;
2 N, A# R0 I" u2 i( N continue;6 `: P8 {* X, e
}6 {, y+ z; B) M6 ?$ d+ g* I
str=str+ AnsiString(char(c1));
: N& f6 X1 L: m& _2 E1 w0 M. k1 z4 W }
}8 ?' v R+ v2 l Edit2->Text=str;$ o- a. }0 ^; d" N' n* n
delete cTmp;cTmp=NULL;
& C5 r+ V5 \, l9 Y$ I7 H; {} </P>
3 b" `2 z7 E! ]9 Q< > 以上代码C++Builder5.0/Win98 SE下编译通过。
1 d) P- K/ X- p% `5 Q( c, o/ c</P> |
zan
|