- 在线时间
- 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>
! h& }% w) B: G% W0 O< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字$ g" M/ B4 Y' Z& \
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则" q( J) @' U3 i6 i2 T$ y5 ]
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163% z2 Y3 @: k, s2 t* w
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
; G }, e; f: e/ i+ v 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面, U! V& H6 I3 N% c& A, \
我给出一个例程供大家参考。</P>6 Q: z D# s3 }( P- P6 e2 ]3 I
< >
6 e2 ?$ t' r4 D5 G 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
; U7 L5 M9 T! g* U< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
: k) w3 H3 V! q# I @: _单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。6 |& X/ V& p1 N8 C9 o0 I
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
6 u* B/ B' x* @/ nvoid __fastcall TForm1::Button1Click(TObject *Sender): ]3 E6 o3 M, S
{" n2 P& q9 j: r9 m: E3 a
int nLength=Edit1->Text.Length();0 \; j U- W1 H* P, F
if (nLength==0)
. a `1 H/ J- a3 O$ {: z5 z9 a" w return;# H9 N- Q n5 {8 [% g' R& t
AnsiString str="";8 z/ l3 \7 s" O' y
char *cTmp=new char[nLength+1];
1 P9 v1 I8 r* t& t StrPCopy(cTmp,Edit1->Text);
4 C& b4 Y P+ I D0 ]1 Y `3 n BYTE c1,c2;
3 S: X7 y( D' X" h3 c int i;$ T3 c; H$ `$ a3 c3 D
for (i=0;i<nLength;i++)6 d) l. Z. _. [. r2 k
{ w/ `4 [. `6 m! ^# \( Z
c1=cTmp;6 V4 v8 F H* o4 U' h% z+ n, A
c2=cTmp[i+1]; Q& [1 _' B3 z/ Q/ Q5 Y
if (c1==163)//判断是否为全角字符
8 x# x4 g! D' ~1 [7 J) b {</P>
. \3 `* D- k* _" K: M. Q3 Q< > str=str+AnsiString((char)(c2-128));, a! r+ D/ T {8 U0 j" ^7 o' P
i++;" _; O( _! P# ? c; N$ z- s4 i, |
continue;
7 U* ]9 k H U% x; F( A }9 Z9 c1 l9 f* `7 J
if (c1>163)//判断是否为文字2 j! n# X, `- L* e2 @1 y
{</P>
| m( B: L a& d' I# c' `0 G< > str=str+AnsiString((char)c1);
+ R) {2 E y* T7 T; D str=str+AnsiString((char)c2);
, R6 N5 p5 P/ }5 J8 k4 S2 L/ w i++;
2 [& X8 V) T! |% V) A- P/ @) u continue;9 @5 L J+ k; k. G9 h
}" ^+ g9 j+ y7 x+ S1 }; i: l
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
* ?: g( s( a9 f5 f/ y {
; k- G9 [# C9 N2 H str=str+" ";
' y+ d I& b1 s6 _7 }2 ` i++;. q+ e0 X: ?* y0 w) j
continue;. C3 K2 q. k4 k: S4 C/ t1 m f
}0 o# T }$ h0 D `% ~
str=str+ AnsiString(char(c1));- f( C, O1 L- I' z9 x; g
}
8 q# c: U, l2 c' N$ s Edit2->Text=str;1 u) a) o9 P& f: m
delete cTmp;cTmp=NULL;
" m6 K! t r9 u" I) h} </P>$ X% P4 I7 ^8 Y0 I, {
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
2 H9 {2 {, g& l$ @. f$ O, s</P> |
zan
|