- 在线时间
- 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>' x. `1 q! ]7 s6 _- ?2 b' o8 K1 ~
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
% e6 d/ B4 L @- F2 U8 l节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则6 \0 m/ U) J( l" Z9 }
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
8 `' d6 v1 E: ]( H,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。+ O; x. M2 d0 a& g' k8 b
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面2 M2 T; w* K2 U% T/ l
我给出一个例程供大家参考。</P>
* W( r! m7 b! Z) k7 _7 e< >
F- Q8 u$ ^' m- s 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P># Z/ \& }4 K0 E; s K
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。. o j* o+ b; V* z, L
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。* R' h! n {+ Y0 H7 l
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/: n; T: x4 M6 Z$ H% {! H7 V# N
void __fastcall TForm1::Button1Click(TObject *Sender)
. u7 P- |/ |* p, H' D5 ?( Q{
3 s; N3 b% E! ^/ r7 X5 E; @ int nLength=Edit1->Text.Length();- c F# A8 H% O* Z0 K
if (nLength==0)
# q& M3 g: ]) R return;
% {- O# _ t% m8 P$ K, y: d AnsiString str="";
7 [ `# p4 C- V+ k$ G! E char *cTmp=new char[nLength+1];
$ `- q! |3 Q5 s3 R- v StrPCopy(cTmp,Edit1->Text);
2 B# E* Y! h4 ?- n2 ^5 [ BYTE c1,c2;( I* \; [- M% Y7 U
int i;* s+ M4 _& _9 l! R6 r! S& r$ |' E
for (i=0;i<nLength;i++)+ Z' D' F9 w \! E) P s
{9 P9 h A4 w+ h# v" K; h( g
c1=cTmp;: e1 ?: g5 J3 @& o$ _# Y8 u
c2=cTmp[i+1];
) l* T0 C, Z0 S" p# Q if (c1==163)//判断是否为全角字符
! d+ l/ x4 ]7 l( _3 R* O {</P>$ ~4 i9 p5 |4 D( }2 Y3 k5 w
< > str=str+AnsiString((char)(c2-128));
. R3 X$ n: X9 s t. K+ v1 d$ G, q i++;' |0 `) ^) F, j- U6 D/ f
continue;6 _# x0 ~ J7 |9 ~. D7 O# I/ V
}
/ Q, O0 g% V0 { q6 n* r if (c1>163)//判断是否为文字
+ O9 g* M8 `1 q/ |' K# N {</P>& ?" O8 t* p F2 `6 Y* l
< > str=str+AnsiString((char)c1);2 J& h2 j* v7 O* ?& Z" r
str=str+AnsiString((char)c2);
/ L$ x; N- T" ?* C! ~1 _! b i++;
4 a: A& Q8 J b+ Y% G5 G& r. N: V8 ] continue;, K6 ]' R9 r! g% B
}+ ~6 ^4 w8 G, @+ f: a+ _& n
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
- e! r' l" _% m( j9 g$ o {
2 }3 U' b: A& v. [- r" ` str=str+" ";
8 O! T3 Y T3 T) d! e i++;7 J7 k1 F1 H; t" I2 h% K
continue;
' Q$ s' S2 w% S; |% y } _: h- O2 |3 C8 p8 p3 a
str=str+ AnsiString(char(c1));* f# m [6 b' @9 S2 V
}
" H, U6 o6 [! {8 V Edit2->Text=str;( d5 g! n5 I# n3 H+ M+ ]
delete cTmp;cTmp=NULL;! P& k7 A- Z/ m0 N$ K ~
} </P>
( v: W4 `0 S4 g( x& B< > 以上代码C++Builder5.0/Win98 SE下编译通过。 ' u, x& g* j* |( h7 @
</P> |
zan
|