- 在线时间
- 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>
/ L0 O9 Y7 c. [< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字' f/ y+ t1 o4 q+ s
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则3 Y' y: Q' a- s) J/ g/ X
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
+ W. c* l+ i% J6 ^: [,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
& m2 m% \% U& U, X 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
- S4 A& O4 q8 R# e* O我给出一个例程供大家参考。</P>* c N2 C9 f7 u
< >( u6 ~& r2 ^9 s0 g' C
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
+ P2 i0 O- x+ _/ d$ [< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
4 x5 r( Y7 k; r4 n, Z* J% \单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。* O, l6 |% A5 ~8 z2 V. N* C+ @
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/5 H( m' }2 w9 U8 o( q
void __fastcall TForm1::Button1Click(TObject *Sender): A$ n* c6 @: r. q) h! z0 Z
{9 W2 t% T# D& i* t5 m, J1 {
int nLength=Edit1->Text.Length();" q5 k7 O7 P9 d9 o+ G
if (nLength==0)
% q G0 F# w7 N. o3 p return;
8 U1 M V& I+ L, ?8 N, ~% s% r AnsiString str="";8 l! ]$ h' f3 c# k$ y, x/ U+ W
char *cTmp=new char[nLength+1];1 R" i7 I+ v5 L7 _2 N: j* i) k; h
StrPCopy(cTmp,Edit1->Text);6 `! i- Y. H ]4 B2 o1 G
BYTE c1,c2;
3 h( ~- y9 ]) ]! X0 { int i;/ r) {4 h! e8 t, R" `. u. w
for (i=0;i<nLength;i++)5 x, i+ I f( J& b% v r
{
6 Z9 y s2 T, M3 a2 H c1=cTmp;
% ^- T a( m' a" a+ _; `* J, M, b c2=cTmp[i+1];" A+ M' Z$ F5 C" P3 Z5 E
if (c1==163)//判断是否为全角字符( `. g }- A/ ~' d6 e7 Y' u% g N
{</P>2 F* s' S" l9 P
< > str=str+AnsiString((char)(c2-128));1 ?+ E5 B, | P( n/ x& G
i++;: z) V# x5 s! P# A* d0 o5 @0 O
continue;
2 O8 ? }' S, B. R; \# `' R+ g }; n* a/ Y& D9 G2 t" i) H
if (c1>163)//判断是否为文字
I: |3 F9 R! u$ {+ d {</P>
) }, E; C1 J! v& l< > str=str+AnsiString((char)c1);
( Y f# |; ?1 n: A K+ F str=str+AnsiString((char)c2);
/ m- H& v9 m3 h i++;
- u Q' p4 t/ e- J8 U continue;, `$ z' c- N& P8 z
}* l6 y9 n& U+ _, y3 \) Y. f% G
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理 p3 W* T' O. l1 v) [/ t
{
5 ?7 A) B+ g" i7 f7 h: K str=str+" ";* ]% ?5 n1 y# c, ~3 @- A
i++;) }, z& a* U% o1 J5 E4 q, R) N
continue;
# k2 | F! j" N& E" V/ V' } }
' H# c3 a6 x1 }+ T* T7 ^0 e str=str+ AnsiString(char(c1));
# V1 M& N; A6 D0 s% u) R2 Y" s }( G% M- H+ U. g! ?2 v" r, `
Edit2->Text=str;: [9 L4 k D5 P) E1 G
delete cTmp;cTmp=NULL;
4 r& V$ s5 ?( l1 q( [4 ]0 B/ G; w' H} </P>6 |" @$ _2 O. ]+ T4 N3 |" |/ W2 h
< > 以上代码C++Builder5.0/Win98 SE下编译通过。 2 r, j7 k# F# e4 i7 S
</P> |
zan
|