- 在线时间
- 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>, w) f: I: Z0 }
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
& L; C7 X& E1 L, B7 i# S( n节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则2 w' |5 q' y5 T7 Q
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163: v4 H' `. s4 D
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。5 y1 S' i5 Z5 _
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
% P" p/ S' h: M1 c* j2 M2 n: U' P$ c我给出一个例程供大家参考。</P>
/ d/ h6 W5 ?" p9 D< >
- |! t) R) g; M 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
2 x) D/ h+ D) _- d- s, ?< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
* |1 |* d0 }4 C/ w6 G$ r. }单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
. [3 l# w4 j. U注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/; x( x5 P) R4 |4 m
void __fastcall TForm1::Button1Click(TObject *Sender)
* b/ L9 w. a% q" M{
" w) E- j+ U- K+ v; b: W int nLength=Edit1->Text.Length();
: b& `+ w: Q% C: q; }6 u1 Z+ r if (nLength==0)
. v5 O p3 v' `' ` return;# h3 V- k/ W" w1 X0 O: I. L
AnsiString str="";
; e* b/ \- e& w# w5 S char *cTmp=new char[nLength+1];, G+ \5 ]- ~- @6 P; b: L
StrPCopy(cTmp,Edit1->Text);
t5 k6 J, Y/ i9 A' \ BYTE c1,c2;
$ U! p5 q! B- F1 @% |/ Q, } int i;
; u A* A5 x5 j1 s for (i=0;i<nLength;i++)+ E1 \ d% [0 A# e7 U- F* ?
{
6 D' d1 ]# l; ^# _2 o5 R8 K' R8 O" i) D c1=cTmp;
+ _& p# c: e# Y( Q( D/ e c2=cTmp[i+1];
: B& J6 L4 R3 m5 t" } if (c1==163)//判断是否为全角字符
% n2 ? _+ _# l9 Y8 q6 {+ M {</P>% y4 U* m: m Y* w
< > str=str+AnsiString((char)(c2-128));8 G& M8 {9 j. p& X
i++;
5 d+ A: M5 u4 z# f3 ?$ u6 i7 L continue;
0 l+ w! h# F; h! h. W; m }: A1 E: q& |6 P2 {' @
if (c1>163)//判断是否为文字
& q8 c7 P7 z5 q" e6 i8 j5 j {</P>
9 o0 Y$ L$ U# x& ^2 d< > str=str+AnsiString((char)c1);
( N6 T6 A6 q( S3 `. `4 S7 b/ L str=str+AnsiString((char)c2);
8 @8 Q" J* l( p8 ^ i++;
6 ]+ I1 x$ f- Z* \% ]" n: F( T& M! A continue;. c9 @7 w q+ x; G! W" g: L- \
}
3 a, a! d7 W, H3 E' Q if ((c1==161) && (c2==161))//全角空格是个特例,另加处理2 j) y1 g/ i9 f& z
{
1 q+ h* V- m [1 C1 Q# r' K! {# b str=str+" ";- U) u9 R% l3 {, M4 F J
i++;
# t6 U* `# Q+ O" T, K1 z continue;
- t; c, c0 @1 Q4 x, p) i% c }" v! \7 n! C3 @7 j: g
str=str+ AnsiString(char(c1));
( j# K- E4 L; V# L' ] }% v: o1 Q" y9 R
Edit2->Text=str;
: T+ Y/ e& F% K; o R: D% {2 p7 h9 ` delete cTmp;cTmp=NULL;
6 n! h1 a; Y0 q J( p3 H$ T3 G1 F} </P>+ A. b: k% {% h# f, v, ?
< > 以上代码C++Builder5.0/Win98 SE下编译通过。 / M& B* F5 L+ Z4 N' ^
</P> |
zan
|