- 在线时间
- 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>
: n- W' l% e; R* f7 O* S, w< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
8 c! T% g- y- R6 ]节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
7 F1 I* V' P1 ~: P# L) i: v# ]是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于1637 O6 F( `+ \* ?+ g2 o7 ]) Q2 Z1 F
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
7 I+ C2 f5 |8 B* |- [% E) d6 C 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
+ |5 Z2 M, b8 b' `5 a4 C) @我给出一个例程供大家参考。</P>9 U; N4 t7 D9 r0 v% e
< >
1 y8 v6 m: r" }- W 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>. }3 `. c: C0 ^2 ~& j1 p3 C- d
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
4 b8 d$ F3 P- }" m2 w单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
6 x, T$ |* X6 V1 ]注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/- l9 b$ l$ Y% _" d6 }8 J `
void __fastcall TForm1::Button1Click(TObject *Sender)
6 |0 X3 C) C+ L* G4 `# y& H) l8 O{( ^$ d3 r4 c" `8 K
int nLength=Edit1->Text.Length();
# {' @2 ]0 w9 H if (nLength==0)5 [( Y i9 D$ o
return;
' E0 H Y9 [+ G* F+ g( x AnsiString str="";) s3 q: F0 N. S% k
char *cTmp=new char[nLength+1];* N# a5 D. J% l: v7 B
StrPCopy(cTmp,Edit1->Text);
& h/ e5 {6 A7 e4 `- t: P BYTE c1,c2;
+ C9 v- n* r5 s( } int i;
! ]" P+ ]6 G2 K# l! G: I for (i=0;i<nLength;i++)
# H1 C% M7 f5 J7 f" [9 k {
6 l$ d. u4 Q# t c1=cTmp;- t5 d" E4 U" P: W- d
c2=cTmp[i+1];
6 }# {, U! ^2 ~8 X- C6 A, x4 Q( P6 { if (c1==163)//判断是否为全角字符
1 a7 p' p) I1 c. Q$ O {</P># G3 i1 c+ O- P; q3 m
< > str=str+AnsiString((char)(c2-128));6 m3 z' B, F3 T5 V
i++;
# o/ {& n2 t6 h k9 Z continue;
; Y% I5 W9 I) @# n/ O) P1 ^# S2 s }
' U3 Y& k I1 g2 j3 f if (c1>163)//判断是否为文字& F3 ^$ D: U4 ]- x( }- R3 L
{</P>* o5 l$ g6 \0 S4 q9 K
< > str=str+AnsiString((char)c1);
# T- w% a, z8 P9 x str=str+AnsiString((char)c2);
; v6 `8 S$ E& }! _/ f& Y* y2 | i++;
7 c. ?& `/ {9 ^1 W- z continue;
2 _8 ~( ]& ?8 u' ~! D3 B$ v }2 M: Q+ x3 Q) p3 ?- y# u9 X- m8 G
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理+ n0 a0 e- M: {$ z }8 p% b
{$ A! z7 |2 Y* s, M
str=str+" ";3 X; f4 m. [: Y
i++;( \# X! x# o" y8 A
continue;) d0 w, }4 h$ G2 v( ~
}6 V2 i, p2 R! Q7 d. b1 X. W) O: b
str=str+ AnsiString(char(c1));4 G$ s6 W7 @2 E8 n: ~
}
/ c, k+ ?+ ?2 Y' t: s Edit2->Text=str;
7 ]: M, W7 {/ V' w! C delete cTmp;cTmp=NULL;
, u, O; R0 Q* x% u. @7 E} </P>
3 b. I+ W) G! q3 z/ c< > 以上代码C++Builder5.0/Win98 SE下编译通过。
- r4 }* w# ^; I% Z</P> |
zan
|