- 在线时间
- 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>
4 h+ q. @4 Z& _! O< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字% c+ ]; y9 Q2 Z H7 {. w
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
6 Z, S0 o! N) {# [. ^是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163# x% {* Z% N& s, q& R+ F7 n' h! K
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
c# s1 u$ @2 z0 G6 R8 V 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面0 a, W* p; B, d+ W! c' q# |3 V5 }
我给出一个例程供大家参考。</P>
% W0 U* n( ~% K4 {6 R) y< >
8 [0 C" |" T' O4 v4 H3 N 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>3 F3 ` i8 T' D# o! Z2 J
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
6 c4 v, W% { S单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。: o6 \ P% u# g" ]
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
, B: n& W7 X/ c0 Yvoid __fastcall TForm1::Button1Click(TObject *Sender)
+ l/ k. g, s2 Z9 k* T{3 W# {+ E( T" i- D# e/ P
int nLength=Edit1->Text.Length();
5 J! l* v0 ?1 J, y- C9 {0 T if (nLength==0)4 p/ a: w8 Y1 R
return;
4 u7 C0 P7 k* w+ ^$ H3 s AnsiString str="";
+ ?, e# j! X8 Q% j5 W, e char *cTmp=new char[nLength+1];
5 U( a" m5 S& R1 w StrPCopy(cTmp,Edit1->Text);* N& W& `$ S" a
BYTE c1,c2;; o6 Q7 \; U* a, d8 ]3 S! d
int i;
]5 v) L% x$ U! J6 x5 g& t for (i=0;i<nLength;i++)
! j# A8 h9 ^# o6 G( f' f! ?9 Q {
5 B% D1 P# W1 n c1=cTmp;- ^% Q3 Y# I# R% }: o* _
c2=cTmp[i+1];
9 q" `0 u6 P) A( j0 Y if (c1==163)//判断是否为全角字符
2 w6 N$ u3 `, }) h# F3 |) u {</P># h, O o$ \+ c2 K* R l. G
< > str=str+AnsiString((char)(c2-128));( Q6 E7 q+ p; J9 \
i++;! [7 r" P3 h% Q( }- k6 k
continue;
3 H3 f2 @7 r4 W/ u5 g6 f& C; l }
) |4 M9 t, C. V if (c1>163)//判断是否为文字
7 T3 a6 m& v/ [5 f2 ] {</P>) Y! }" A5 |" A
< > str=str+AnsiString((char)c1);
! l. N- J6 F5 c0 `. o str=str+AnsiString((char)c2);* p: T |" E4 C0 p
i++;& D1 N& M' a2 D- N
continue;
4 g: m1 ?5 Q* c# c }
2 }! D2 \+ [+ k& L: t/ E( z if ((c1==161) && (c2==161))//全角空格是个特例,另加处理 Q& X( u. c" L1 k' X6 S: \: K
{# A5 Z; b0 Q+ k8 u4 M2 ?: W' w
str=str+" ";
- L7 S# k; j) J0 R ? i++;
$ X1 m% }* G: d8 I0 U continue;! C2 x3 u- G4 `& M9 L( h
}! [1 k" }% v% i3 m0 w
str=str+ AnsiString(char(c1));0 a8 D" [/ T0 p7 E# {. d: |9 z. }
}
' r9 r8 L# V+ p! C Edit2->Text=str;& b$ P4 `* O( \& f3 N5 Q/ M
delete cTmp;cTmp=NULL;
$ n- O8 p; ^: u0 ?: w, ^} </P>
- K: p2 |- U/ A0 e< > 以上代码C++Builder5.0/Win98 SE下编译通过。 , J3 q$ v0 j; i$ v
</P> |
zan
|