- 在线时间
- 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>0 l- ?2 Q/ P* [9 E* J5 \0 ]
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
, T8 |$ E8 X6 F- [. W6 s, ?节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则5 ~2 h4 S2 Q/ G) N
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1631 v- C# _# v, I: v
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
- U5 T# A. {6 R7 _: t9 b 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
$ U+ T% J( \1 F' U \: y4 q我给出一个例程供大家参考。</P>: v* r5 ?! [ O- `
< >
. H5 F4 Q0 r0 U) G$ i 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>( K0 p0 `6 b9 z1 E
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
0 E: y5 C" R$ X' h单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。6 H. y! ?4 M. I: Q" B2 r$ ~) _
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
" |; w+ \' c, U+ d0 Jvoid __fastcall TForm1::Button1Click(TObject *Sender)
) r; h' F9 s0 }1 O{
1 r! z/ t! ^3 h' ^ h int nLength=Edit1->Text.Length();8 m" k! {! K" {' b8 e7 H, ^
if (nLength==0)! j' W" e5 E1 L/ X5 k7 K$ S; ~
return;
n4 F; g% X, t- z5 j# @ AnsiString str="";
) }& J4 a2 O' x V1 J; T char *cTmp=new char[nLength+1];
2 n; o, \3 p5 l U, _ StrPCopy(cTmp,Edit1->Text);6 ?' z m2 z, B( F
BYTE c1,c2;
& T0 c7 R# |) |6 S int i;
& U' `# w0 n, e/ O, U2 E for (i=0;i<nLength;i++)" O3 H& C6 D: ? h
{
$ F N9 l; C% V- H6 [ c1=cTmp;
- r8 u: f. u+ j2 E/ A( V# \3 l c2=cTmp[i+1];8 w- @" {, m3 @7 T* u, B8 ?* B/ I: t. v
if (c1==163)//判断是否为全角字符
% _& _; d9 k, c" k' P {</P>. }3 }3 x* ~0 t" S3 l6 @9 d
< > str=str+AnsiString((char)(c2-128));# J: ^. }8 ?6 H! s: I' I$ J9 O
i++;
; g8 N1 W/ ?& B continue;
7 G% I- Y3 e8 n" q }5 d: h! Q: o# W
if (c1>163)//判断是否为文字5 n6 y( V0 f8 H& O
{</P>
3 {! i( X2 H. J< > str=str+AnsiString((char)c1);; S7 K: [) X! x% W
str=str+AnsiString((char)c2);/ g# d# e+ z$ K1 p7 A1 n' ^- V \
i++;
$ Y+ r& z% J7 f5 s6 J0 N7 U- {8 {. ? continue;
+ `" i* J: \" x; l1 s }
% l* ~' S8 _0 q if ((c1==161) && (c2==161))//全角空格是个特例,另加处理$ O; Z) \, q- e7 `1 R- Y
{, d3 {/ b* ^! B5 t# h" h
str=str+" ";
; T5 U' T; r$ s- W' J i++;
) r8 L! S. P8 B3 ]3 ^) C continue;
. D9 `( i$ K1 |$ G9 Q+ V4 m: m }! x3 h. _- ?- l" A4 N3 V9 K
str=str+ AnsiString(char(c1));
8 W2 I+ {. B0 G4 s" \. @/ V2 W }- J. I8 y8 y$ K+ }' R6 M$ {2 K
Edit2->Text=str;, ]2 m" v: G' i9 w9 e
delete cTmp;cTmp=NULL;
7 X# O) C: v) l* Y" q+ c} </P>$ ^! G2 M& q% l) l5 Y5 M
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
5 K# e) t! m, O9 j( h7 W, h</P> |
zan
|