- 在线时间
- 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>
7 K3 Q4 L1 G5 V8 s) X4 S< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字( w) D$ D. T3 |+ Y7 e
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
( V4 B7 F; q) I1 x是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1633 A3 j, x z' }. B
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。- I' g$ D5 G/ O# q2 }& Z5 g# E) A5 `
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面- Z5 p S! O, c6 w6 H; [8 |3 e
我给出一个例程供大家参考。</P>& l0 r- j! _" Y. ~2 Y
< >* r; j, X8 }/ [) a1 k: ~; I" `6 G
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>* J8 U2 S+ B) S7 g( v
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
$ v! n9 B5 _2 e* X单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
8 S/ j& |" C2 Y. T注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
G# f- o( D% w& m( ovoid __fastcall TForm1::Button1Click(TObject *Sender)$ d9 Y4 ~+ T3 E) B" g) D) x
{3 M4 j$ ~/ B0 R1 j4 z6 n& N
int nLength=Edit1->Text.Length();' Y F7 e: ?- C' H, y5 e9 v
if (nLength==0)% j4 U6 ~+ W k k
return;4 j+ P& X& W; P d8 m6 W6 \6 r
AnsiString str="";
9 f* ~5 W# W* O8 u2 u0 c char *cTmp=new char[nLength+1];% T D6 p! G; A$ x# S/ m4 G
StrPCopy(cTmp,Edit1->Text);
Y( p0 O/ f, V8 T6 i BYTE c1,c2;
( g- K7 b5 [. K# H7 E9 K5 E int i;
' j0 ~0 y* v2 M" K4 @ for (i=0;i<nLength;i++)
( u; r% o8 J2 }( D( Y {
0 D% x( d3 D7 H, j( E# j c1=cTmp;8 w0 k- a7 c& |3 B
c2=cTmp[i+1];5 T% g( A3 K0 k% T
if (c1==163)//判断是否为全角字符
' H! V: E% K' a# t2 H# h; X6 x {</P>1 U$ R3 G! A1 ?. m# ^2 G! m
< > str=str+AnsiString((char)(c2-128));* i4 X; o4 G7 f8 x* E
i++;
8 E$ `( }2 r- } continue;0 S4 f$ k- q. ^: B
}; A2 D* A9 O+ B0 e7 P3 N
if (c1>163)//判断是否为文字
2 I2 z+ V2 l+ X2 [# I/ _4 [% ^ {</P>% @- a O! {% e D4 m/ u2 Y8 G P
< > str=str+AnsiString((char)c1);* S3 A4 s$ w. k$ ~
str=str+AnsiString((char)c2);. K8 c. J+ v- g! b
i++;; ^! s4 M+ q2 V- C F+ S# }) u2 c
continue;, p( X1 m7 C% E9 ?- J2 `+ w
}8 Y( \5 T A) P. H9 ]9 I/ f6 n
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
9 |% S9 ?$ ~! c, m2 } {
6 G) a7 P8 G( [) g3 N str=str+" ";
. l5 M. v8 H" f W: Q1 ?4 p, A i++; r+ g% i/ g/ u5 l d5 N* Y w2 C
continue;
- c* ?0 @, p5 X- C, l! X }
7 R. \0 q/ v- F7 W str=str+ AnsiString(char(c1));5 \5 u9 r+ k' U4 F6 b" _- ?, i
}
; r. ^: a, ]( A& T/ o4 T6 z Edit2->Text=str;' f2 t/ x5 v- ]3 N2 J6 v
delete cTmp;cTmp=NULL;/ M1 P9 G/ w$ w8 O" @! @- g) o
} </P>+ @ o6 m0 P- [0 [" L& m& Y
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
. S& s% E- z/ ]* z3 |! p</P> |
zan
|