- 在线时间
- 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>
1 }* |, c5 ~; L6 u6 a< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字 p: g) b& Y5 l0 J( S3 _
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
7 _9 V# M+ N" o4 `& N* Q是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
9 j+ v. J. |/ Q- t,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
' O% E: q( v2 y# Y8 _( K; Q 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面, T5 j- x s" E1 ]1 ?+ p- T7 T( E! O
我给出一个例程供大家参考。</P>8 c, F+ V1 W; J
< >, z. r' N" }( t& b, B4 M
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>6 @. G$ T; M( z0 s& q' j2 c) z
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。, n( M! O" j" x) N& U
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。4 E3 @8 |5 P" L7 R( a, _
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
2 b4 F. D0 Z jvoid __fastcall TForm1::Button1Click(TObject *Sender)3 _( U% f* A+ H: W/ [9 c
{3 w1 ~# a# m1 ~: f; w% d
int nLength=Edit1->Text.Length();9 Z; o3 z$ s5 ^' |$ j6 L# o
if (nLength==0)
, ^. `5 H! e3 g. [+ e2 [2 j return;) A# s! X P5 y3 A. \2 X5 q% {
AnsiString str="";% f/ L% K8 }9 c, F" |
char *cTmp=new char[nLength+1];
- h8 @/ |# y: E. y( J StrPCopy(cTmp,Edit1->Text);
, R! i% K; d; D9 p7 ^" j BYTE c1,c2;8 L# ]6 _6 D% C$ Z6 v2 K
int i;; C$ e, v" J% H6 z0 `3 Q
for (i=0;i<nLength;i++)5 i2 z* U% Q4 z, ?
{
/ u# ]+ [4 T7 t- v* h& L- M' ?+ X c1=cTmp;
" X5 y; _& M( u) p9 t& g c2=cTmp[i+1];3 o4 i e' E9 O) }
if (c1==163)//判断是否为全角字符/ }, x9 J" l3 m
{</P>' [! e7 _2 g, y- L
< > str=str+AnsiString((char)(c2-128));" n6 ]9 U2 [8 M2 v. j
i++;1 m$ g, R% k) T- I- C x, b
continue;
. R. u' ?! t' h. B1 z. e( J( _ }/ v* v5 E5 Z6 I5 m! a; z+ F
if (c1>163)//判断是否为文字
% ^5 y I! t8 ~ {</P>
/ @; [4 I# h; m4 h< > str=str+AnsiString((char)c1);
+ b" W' b) w: D% m! f# }* O str=str+AnsiString((char)c2);
4 U' t! j, x" O, L7 Y6 S) g i++;
& Q# S. R: a/ j continue;
/ Y& ~! a! Z# m0 N7 l" ?+ a }8 s6 y2 _% M4 h3 x: N. K3 P8 `- L
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
! i1 n) c F5 x! o( d {/ [) B0 C1 f! L, e+ h/ c: M
str=str+" ";8 L+ n9 S% M2 ~% K T4 b) `3 m1 T
i++;% p7 l0 n7 v' c, ]& i
continue;% E- b/ v# Y# C+ o
}
! {8 S6 |; n y' @$ s) p str=str+ AnsiString(char(c1));
+ x! A1 C% q5 d }' }. U) @# x0 f5 m0 d- m) K1 t
Edit2->Text=str; z! x E. b: Q3 P# w/ ]6 S
delete cTmp;cTmp=NULL;
* j+ A0 `! P: l- E1 O} </P>
. U& y5 o! R t/ n< > 以上代码C++Builder5.0/Win98 SE下编译通过。
# f. B& Z/ q8 s) W2 C! L</P> |
zan
|