- 在线时间
- 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>5 j0 L: \; u% [. S+ g- n" B
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
, T7 A$ n$ ]2 x9 y节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则0 p5 P* J3 W3 B1 M& }" R- b" p* C
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
% c, I3 y0 l# a5 z; g3 {* },(如'阿'为:176 162),我们可以在检测到中文时不进行转换。: Q+ {+ m1 i7 j( x: n ?
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
3 D* d D. s; o( D1 v我给出一个例程供大家参考。</P>
8 Z# { Z I- t! T- O r/ }$ J< >
! D0 T/ z4 X" H | 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
% n$ ^! S! Z& Q# Y/ {9 n< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。# P$ w; r2 f* L! ?" S/ X
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。' J R# r1 Z) P6 r1 ^3 L
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/+ v l" O. U4 C; M" @3 [: u
void __fastcall TForm1::Button1Click(TObject *Sender)
' A6 _$ a! L8 l3 M, J! `6 I7 T{
3 h1 \( ~5 q1 J int nLength=Edit1->Text.Length();
) i# U$ p$ }) n6 V if (nLength==0)& v4 U, Z, u; x! w1 y G, Y
return; }, R \( h8 S0 \/ M7 [
AnsiString str="";
' \) @) {6 j9 y% Q2 p( _ char *cTmp=new char[nLength+1];1 B1 _3 _4 ~" z) R- K! D( H' F
StrPCopy(cTmp,Edit1->Text);' F. f- Q8 g! a' u
BYTE c1,c2;
9 g0 @+ m4 s9 L% m1 b: k int i;
/ V9 ~! G$ _& G for (i=0;i<nLength;i++)
$ P# g f1 n0 X& L+ O& y' ] {. e6 ?: I- y/ Q+ u: R$ }
c1=cTmp;
$ l: \4 G6 L! \ `! D c2=cTmp[i+1];6 s* p0 k8 m7 w* [6 X
if (c1==163)//判断是否为全角字符0 u8 H- j( z1 U n$ I" S1 ?
{</P>( H, F5 Y/ ?# @8 }& B; j
< > str=str+AnsiString((char)(c2-128));
2 r. |$ l2 u; z0 } i++;, F9 ^+ D" `/ d7 L4 X6 d$ D- D
continue;; n, V2 I* Z5 u e- `" t
}6 S- w5 r B0 l3 ~$ y- E
if (c1>163)//判断是否为文字0 @0 `$ w6 c! g* J3 J/ {) W
{</P>
8 r& V! m# \( k( G( Y5 V+ l! [< > str=str+AnsiString((char)c1);8 E! ^2 _6 a2 s! `
str=str+AnsiString((char)c2);. J8 v/ l1 T# ?9 t0 C1 l3 o& q
i++;
. P$ g( ?: \, d" { continue;0 A/ k; {8 W$ t9 g$ S# o% Y
}2 y2 }; t3 W( T+ ^
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理' O2 Y" y0 }; O) e) J0 Q
{
" p3 h! X5 b: \) \# {4 w; n/ ? str=str+" ";6 r; M4 k8 l$ H% m1 \
i++;
. H6 l, S+ W# l- w+ c9 z continue;! f& }6 N3 ^5 h E. \
}) W# i& _7 {/ N" [% K! @3 G
str=str+ AnsiString(char(c1));9 q% s9 H ?, U" `
}
- J' S) ?( B7 f0 E Edit2->Text=str;" K0 a0 l3 } ^) i$ w& y
delete cTmp;cTmp=NULL;8 H6 ~1 q/ r" }; v8 d- T& Q
} </P>
/ N) q( z) B9 t' l8 }< > 以上代码C++Builder5.0/Win98 SE下编译通过。
0 D& a6 }: N$ D</P> |
zan
|