- 在线时间
- 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 u5 j$ f* [ I4 v< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
$ H) w( M% X* \' c节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则! n: n2 f; N2 ?/ F- ]
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
! I) a4 m3 A+ Z Z+ V( T,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
% P- o$ {6 z" _6 D$ m' ~. V5 w+ O& o1 Q 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
2 a. x0 @- w! ]% K$ F我给出一个例程供大家参考。</P>
5 g4 Z- N+ @9 ]2 O4 ?: c8 j< >
0 W9 d' n2 r' D/ } 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
" [9 f- x) ?4 i4 O$ K/ ^< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
# P0 K! Q, e1 t: w3 L单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。7 {$ }0 s8 f6 x
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
; v p! s7 |( h. ?1 {! y5 [/ P: pvoid __fastcall TForm1::Button1Click(TObject *Sender)
' [. g% J, M4 R/ h{. W) g9 v$ [) O
int nLength=Edit1->Text.Length();9 B" p5 t+ A$ j! |; `8 d6 x
if (nLength==0)1 J; B& l) \% e5 c7 K% Y* @
return;& b, Z+ W0 Q1 [2 q+ I
AnsiString str="";/ G8 F8 H4 F& k
char *cTmp=new char[nLength+1]; `& S6 R9 ], J. l' _; _5 E, S' ~
StrPCopy(cTmp,Edit1->Text);: s. ^' @- R% Q. w$ q$ h
BYTE c1,c2;* M2 }( _- H. N8 e3 _, p# V9 r
int i;
c5 T% b9 c- M for (i=0;i<nLength;i++)" Z0 ]/ N' w- a% P0 |1 T! [
{, v9 d- n P3 c$ ?, [1 ^
c1=cTmp;
" }# o9 v. p) b- ~, W7 P2 r% a c2=cTmp[i+1];0 G* h9 V6 F& S" C5 {8 B% e. s
if (c1==163)//判断是否为全角字符
& o2 D5 }" b8 }/ P3 | {</P>! B# U# C( \* Y- N" o: R9 f4 E0 k
< > str=str+AnsiString((char)(c2-128));
, U7 k0 _4 B! T# B# U i++;
, `+ f$ V3 Q, }/ D# | continue;
9 ^' E& X7 `/ ` }. @! I" d4 A, W5 s3 L. |+ O
if (c1>163)//判断是否为文字& f) x! ]8 D9 v4 d( Y+ E# H
{</P>
, r7 h @9 |0 w& l< > str=str+AnsiString((char)c1);
4 p9 C0 b+ g `9 Z, ]: m str=str+AnsiString((char)c2);
8 {" o! x5 f( c2 b3 O i++;
X6 c5 q) h8 x7 N9 {9 G continue;
* N# M% H4 V4 z5 f }
: R7 ^3 y- x" z' H7 v5 }- s if ((c1==161) && (c2==161))//全角空格是个特例,另加处理5 `( l( d q5 ^( v7 d' ?7 y t7 V3 G. z
{1 j U" [$ v. z& q, f
str=str+" ";2 e: i# \! x" m
i++;
) y( X4 }) D2 a6 U+ M continue;0 `3 ]7 G8 f# w
}/ R( |* W/ m2 t$ p1 e0 l8 z/ q
str=str+ AnsiString(char(c1));. g% q" D4 n8 \
}
) _- r; S7 X) O7 g3 n' q Edit2->Text=str;
# O3 o$ s# G# k' j, _9 {( ` delete cTmp;cTmp=NULL;. B0 J3 c1 a: S9 P
} </P>
. ]' ?' o: Z) C< > 以上代码C++Builder5.0/Win98 SE下编译通过。 + Q8 S2 s5 w7 c2 c$ M! d% n5 T
</P> |
zan
|