- 在线时间
- 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>
; f; |: c1 r8 g# D< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字4 M! Q! t5 m3 c) X+ a, T5 ^
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则% A2 g- j, h# Z: U8 Q& y( `$ C W
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1638 d+ M6 Y" Z) f' C
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
3 u, Y( }$ x; Z- a 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面* s# Z* N5 ?. {9 j/ z9 r
我给出一个例程供大家参考。</P>
" V1 X% z4 ` D% S2 y< > K8 ^# v \9 i0 E3 O+ i
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P># V% J$ W7 G4 T% I- L) L
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
5 C, x* Y" a8 D6 ?单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。1 c. e( _" H4 N* I# ]
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
/ ^. ^ j ^$ e: Y! K8 _void __fastcall TForm1::Button1Click(TObject *Sender)/ u; g4 c+ C5 a: q) n2 q( m4 w' T! ?
{
& O1 U, k q3 Z* Y) R+ `' w int nLength=Edit1->Text.Length();. p$ U- Z1 y' a- l) S% P
if (nLength==0)" X6 v9 I0 p& N& @
return;7 b7 M1 s; z. g: d! D+ {( I
AnsiString str="";
6 g- K) g) p* H0 t, V: x9 _3 B char *cTmp=new char[nLength+1];
/ T1 _+ o+ X( t# f6 ?" u* t2 c StrPCopy(cTmp,Edit1->Text);0 q* x- Y% S) g+ H/ m- c* C
BYTE c1,c2;
9 c* C7 ?) I; \% g5 i: ] q int i;
6 Y! T* }6 f. M0 Y R5 i1 C! N) T for (i=0;i<nLength;i++)/ B6 w- o* p* e! G) r. n
{
0 F* F: H. g) V) u c1=cTmp;
* m; P1 {3 J/ s c2=cTmp[i+1];
% c3 D$ x4 R1 { if (c1==163)//判断是否为全角字符
% [" z8 s0 U% l* ?* H4 y7 X {</P>
9 ]. }( I5 R9 k2 w3 V% z" N< > str=str+AnsiString((char)(c2-128));/ ?9 f( Y0 Z, b5 q W" s4 c" R
i++;
) ?, k7 c8 s3 w2 {) t% K9 O0 H continue;
; b d# v, |5 y4 m }( F, }: ], h- l# L1 R
if (c1>163)//判断是否为文字
! m0 \) ~: L% B! ` {</P>* h+ [% }# D2 b( F
< > str=str+AnsiString((char)c1);2 [& P4 Q8 O5 o% {# h$ @) T
str=str+AnsiString((char)c2);$ \9 r7 J* Q# a& @1 D/ i
i++;" U) V+ y' a: @9 {( s
continue;
7 X/ h1 P! p5 m# _( H4 U" N }
6 w3 H x1 o5 f( g: d if ((c1==161) && (c2==161))//全角空格是个特例,另加处理2 Z; ^% L7 c5 c# L% [
{
3 V/ S: Y) Q$ X str=str+" ";$ R+ \; Z: k! l+ ~3 A
i++;" o! ~# B$ `' v8 @0 ^
continue;
9 d- g6 r& m- z& X2 U }9 g0 {2 ], b8 c
str=str+ AnsiString(char(c1));$ \9 W) f" U# i1 |+ b) N3 P% n; w: b
}
9 F ]+ Z3 J% i: L2 ^+ _ Edit2->Text=str;! O: s/ M! ^" Q! J( o/ |6 m! X
delete cTmp;cTmp=NULL;# f' ?. s& [ u7 K) q# X: F: w
} </P>
& D* x; p' O) u f" Q& \1 Z< > 以上代码C++Builder5.0/Win98 SE下编译通过。 7 h3 [2 |7 d E1 a+ S
</P> |
zan
|