- 在线时间
- 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>, P6 u$ M* l( o9 ~3 _ B
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字$ i3 p, e* G6 ]& B' F% N! s
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
# `* l# V* d/ i是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
- F3 O- |1 w" W3 Q$ K3 x' \) x. \& Z,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
* J& P' I: c$ A, M* _ 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面* `! s; J- k9 w( w$ F1 R
我给出一个例程供大家参考。</P>
/ ^$ L5 D9 z3 l" X6 x; T5 @) X< >* z3 e- G; }/ `' G5 s+ G
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
! H7 r6 X# p p, r4 |1 c< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
) `! T) x4 q% ]; W单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。7 ], ?! t* i9 ]( m" @6 r
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
1 u. M: o/ ?0 }8 Yvoid __fastcall TForm1::Button1Click(TObject *Sender)" i4 ~! S |8 ]0 l% i. P5 o
{; Z* i3 V( n- I3 J) T1 w4 Z
int nLength=Edit1->Text.Length();6 [! C+ ^, E# Q' U, r
if (nLength==0) Y% h5 {: N6 w, p8 a: R
return;1 D: W+ u9 l4 C B& C5 h
AnsiString str="";
; x* Z7 o2 I- a: Q( x: K1 r char *cTmp=new char[nLength+1];& E' B5 {* N, u/ B( A
StrPCopy(cTmp,Edit1->Text);
% h8 U& z+ ]+ B( j, M BYTE c1,c2;1 a2 U+ X, G9 ~( Y
int i;
9 O" u$ o! W3 e' S for (i=0;i<nLength;i++)
: R& f% T0 S0 ^4 |3 [5 } {2 N/ e D$ _$ Z( Q9 v, X
c1=cTmp;, i5 U" ~: ~, Z; p/ \8 R
c2=cTmp[i+1];
( P: r5 I o5 p- {% G if (c1==163)//判断是否为全角字符' m4 E- {% e1 s/ i" q9 }% U
{</P>
( A. \/ Z( ~- ~" F' K< > str=str+AnsiString((char)(c2-128));" A) P( m' e% q9 V3 z- U
i++;
& X: _5 J8 I* F continue;
& c# O! }3 s* p7 X: e }2 {3 Q; y! v8 g9 f- l
if (c1>163)//判断是否为文字% S8 Z0 o9 _0 b& B! o9 T$ r: Z
{</P>
2 G. L: H1 N6 q6 }, q* ?& r< > str=str+AnsiString((char)c1);- m3 ] ]. L" v# Q
str=str+AnsiString((char)c2);2 }4 D+ j$ e9 y! i* N" T
i++;$ F. g. S& m' V( C
continue;1 D4 B3 P( G; `7 h% u5 j5 A' h7 O" X
}
/ i2 _. M' u# r9 ^ if ((c1==161) && (c2==161))//全角空格是个特例,另加处理1 l' R0 V+ I; k3 D% Y+ v
{
; N2 A/ ?% E" A) @% ?3 b0 @( ] str=str+" ";
# E" ?" s3 o* j) g) I# b0 m i++;( g" p( @. {* w( R0 i
continue;/ q9 k/ o- e3 ]( O8 p4 f
}! c1 m% q7 g/ G- v7 o
str=str+ AnsiString(char(c1));: x9 ~( u4 v* x+ H( ?
}; R! q3 D1 [1 M- E! N: E
Edit2->Text=str;0 a2 }" V# ]" ~" U
delete cTmp;cTmp=NULL;4 v( k0 y8 w9 n1 A, k
} </P>3 n L7 b% W' F& `" P- b
< > 以上代码C++Builder5.0/Win98 SE下编译通过。 * c4 \4 [9 \+ N; ~/ c
</P> |
zan
|