- 在线时间
- 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>+ k' n7 ?/ n: R8 E% |9 R
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字* s4 |1 V/ `6 H3 T! L/ D
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
) C& i3 \! z4 t0 x5 p1 K8 E是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1635 D2 D- G3 y; D. q$ Q+ X
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。5 B g8 i T5 i2 S# X0 @$ I
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面$ ~/ {+ R- h0 J
我给出一个例程供大家参考。</P>
* [% V1 K' n; ^8 ^5 ?< >
$ H4 o3 H) w" J* ?: j! s+ F 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>3 D0 d) k- S8 m2 S* r& x
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
0 U0 L! k' C/ P' U单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。) g1 s, H& J7 _' z8 t3 Z
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
8 y4 _! H+ M7 j& b: ovoid __fastcall TForm1::Button1Click(TObject *Sender): H& B/ l# J! x; `) i6 ?
{- h& j9 w W! c* A: \1 l
int nLength=Edit1->Text.Length();
, _, C& \* _; j6 E7 z |" z t$ n if (nLength==0)2 h! `! W; [- E7 { y2 H9 G
return;
3 I D( W# R, w* U5 y7 B AnsiString str="";& V/ V- @, P8 q2 O0 j1 |0 f* P- R
char *cTmp=new char[nLength+1];
0 w! D& @, J6 Z8 n& K; A StrPCopy(cTmp,Edit1->Text);
8 x& u1 @# R' A, } BYTE c1,c2;
: b- u0 V6 S8 ?7 t& | int i;
4 Q( a0 W, M& t9 J4 s" K for (i=0;i<nLength;i++)2 \+ d+ I @* ]4 A
{
0 i# [/ \1 [* Y9 G0 | c1=cTmp;, L! w' Q) d: e& P1 U- b
c2=cTmp[i+1];; u% ] a/ N. [2 @, P) _
if (c1==163)//判断是否为全角字符
% {" f$ D4 n; b. w( S% c' u {</P>( l% h* V0 l5 ^6 s8 |
< > str=str+AnsiString((char)(c2-128));
; B, J6 ]; }! k. A' E i++;5 [; P. C4 e0 k6 v; T2 C' a
continue;
' h& m( t0 a6 B) Z. X }6 q' N0 O% G6 b/ ?& I' J% q
if (c1>163)//判断是否为文字2 E* g& H5 e6 N
{</P>5 E' S5 `. B( ~3 D( J
< > str=str+AnsiString((char)c1);
( v2 b, t! x: O, Z str=str+AnsiString((char)c2);* Z5 r% }) y4 }( ?* O
i++;( K0 `: l% v' s% ^
continue;1 I' Y. E# }) U. ~8 y
}
( B$ w2 {; N9 a w if ((c1==161) && (c2==161))//全角空格是个特例,另加处理" L' ~$ b% d8 n
{- ?0 P# h: v* |8 X; P
str=str+" ";
% I: u- Y+ t8 N9 o& o3 O: S i++;
& X( p& C/ L% @ continue;! V3 _: i' i/ Y5 R
}
' L) p. h+ x. H' q% N3 N; I, l str=str+ AnsiString(char(c1));- k2 J1 x, R3 Y/ ^4 H% s( X d
}) ?: I' ?! d* H1 g( Q, I; \- ?
Edit2->Text=str;' u$ C1 z* L5 B, Q5 k) }: f; O: p" w
delete cTmp;cTmp=NULL;
* i; ]! V! X" Y: b* h3 E} </P>/ o5 w) b" C( v8 P: P; _/ H
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
5 ^& i; s: y9 h( I( _+ H# @6 d</P> |
zan
|