- 在线时间
- 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>& ?& I2 i4 p# b4 w4 N/ G/ x
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
4 }! O( f* ?1 _节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则9 ~: T( v( d" T: Z5 t' @* _% b
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
0 c1 k. H* C# P, n; D+ a5 _7 },(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
) w. g8 k5 k" w& Y 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
. Z- ^, o. \, p, ^2 g0 }" ?3 ~我给出一个例程供大家参考。</P>
1 x& `' l, u, |8 F9 Q8 m8 P< >
0 g4 T# V9 M& Q1 m% U) i0 v8 o 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>! E0 g+ r# S% {4 Y. ^0 }3 p
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。$ K& k$ O5 w- R7 [. r1 d
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。3 t) p5 j" O, g# w
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
! S: `# [! B, B- G8 Pvoid __fastcall TForm1::Button1Click(TObject *Sender)
: o+ {; N/ `! W# b% E0 Z{
) i2 N* q8 m0 m int nLength=Edit1->Text.Length();
3 [0 \' j. T' O7 ]7 i/ j( V if (nLength==0)* K3 g: R, e5 U) p$ s; w4 w
return;( }- L9 A6 T: b4 @+ U
AnsiString str="";
1 N5 m/ o, l- { W char *cTmp=new char[nLength+1];
0 D" @0 d2 R# Y" ~$ ?4 a } StrPCopy(cTmp,Edit1->Text);
( N/ t7 o- E6 v, C3 w3 s# Z BYTE c1,c2;
2 L/ B# ?, E2 N) b. D1 ^% X int i;/ d8 s9 q* F) {: h- C& k: g+ ^: x
for (i=0;i<nLength;i++)3 q7 s- _! G. j/ C& E
{
3 Q4 M3 u+ L& h' g# _/ @6 v2 | c1=cTmp;$ q z3 O8 v+ Z( P4 O$ [
c2=cTmp[i+1];, Q3 ~, n. c# _
if (c1==163)//判断是否为全角字符
5 D+ ^1 g2 k! s! I {</P>7 S& l/ ?' b9 V( L; A6 i6 x
< > str=str+AnsiString((char)(c2-128));# W+ A/ m' @3 ?% {$ ?4 m4 Q
i++;
7 E: D1 X: f$ Q continue;
! A [3 b: I% {$ \* [ }
% ~5 l2 g: G7 }2 [6 M8 O% |' f! b if (c1>163)//判断是否为文字# e0 N$ u8 x; E9 N' r- ]
{</P>
$ x1 y" W3 Y$ T# K( V- C* p: }9 t< > str=str+AnsiString((char)c1);0 f7 c7 V0 p% Y$ \! J1 B; n
str=str+AnsiString((char)c2);7 D6 A) O& G! V- F* \# i
i++;
1 f) J9 k0 a) B' ? continue;
+ |9 J8 Q+ \) V7 ]8 U- e }
- d& q' n0 B4 T& n9 F5 B7 P if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
0 E& k3 E0 Q' @( `! d& A {
+ ^ w6 z8 A% G. Y# x8 E str=str+" ";
Q9 ~! O' P8 d4 Q$ L# j i++;- a/ U6 V* A" V; v& J, ?0 b3 ^( i
continue;" G5 D; I# f! J
}7 v3 Q) |6 z) g4 P3 O
str=str+ AnsiString(char(c1));
' D: k' u `) e }, d) a E! a2 r2 e7 N
Edit2->Text=str;8 C% @: {- ?: Z9 k+ T" \
delete cTmp;cTmp=NULL;
& V ?7 q# E: L} </P>0 U& D3 i9 g7 j: ~# C
< > 以上代码C++Builder5.0/Win98 SE下编译通过。 ( \) G3 v( x- H& w
</P> |
zan
|