- 在线时间
- 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>& L' c4 E6 o' K) a* _
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字1 Y% A6 L( m* K
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
6 W' A! Y1 p; D2 R* X+ E, c6 [$ [$ Z是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
9 Q1 j" e; ?! \1 r- a,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。: ^8 S& K9 O6 J% U
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面; J1 ^- Z" _8 j% a+ G& [! I
我给出一个例程供大家参考。</P># \+ k+ _5 `9 [( _
< >
3 P; C6 F0 _( R9 V0 J, f2 F$ w 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>- u# A' ]2 r; B$ x) m
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
6 a, b3 A6 N% y# q4 k单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。# m6 h( e4 x- [. U% Y! |: B/ E
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/$ T3 \* T2 s/ S3 B& W; y, r+ `
void __fastcall TForm1::Button1Click(TObject *Sender)
0 H0 ^' T- O; X{
, y* k1 v3 ?9 ^# Q9 M. c1 b int nLength=Edit1->Text.Length();
# H5 a9 U- D& F' T if (nLength==0)! h+ _, ~0 |1 `) A8 O8 }4 `
return;
, i: L1 y \0 S: O$ p, D AnsiString str="";
' S& I/ B0 O8 g0 P char *cTmp=new char[nLength+1]; b: h4 B' |: S8 n# U
StrPCopy(cTmp,Edit1->Text);$ K& I, ~+ r! S
BYTE c1,c2;0 i3 |* {" f( c+ |& i3 O; T7 |
int i;
% f4 l, O8 S- w for (i=0;i<nLength;i++)
+ L0 F; }- p9 { `; @2 N" e7 ~- ^ {
) M; p: \+ J2 Q8 P4 X5 z7 [ c1=cTmp;
+ m% ?9 r9 w9 E9 E c2=cTmp[i+1];, o7 Z4 t& g# ]$ Y7 H9 ?3 Q
if (c1==163)//判断是否为全角字符; w0 g+ O5 h' P5 o( n9 A; w1 R
{</P>
( ^8 o% [5 ]& T* s$ s< > str=str+AnsiString((char)(c2-128));
1 n# c( U. T: l" e9 E/ U& Y$ D i++;
) X( a1 W! q' T" P. i5 O/ _' G- { continue;1 W( [" ?# j, W+ h. f. u( v# B
}9 G* J# c6 D( a$ c7 V
if (c1>163)//判断是否为文字" O; B0 D. B8 N
{</P>
$ y/ ?" M: C; }8 X< > str=str+AnsiString((char)c1);
8 v2 p+ }4 S- W) N" D A str=str+AnsiString((char)c2);: ~! C; _/ A3 W6 A% q* I
i++;( S9 H6 E( K5 H7 Y" l/ ^, M3 y
continue;
5 p% M$ Q; V5 W+ y0 l; L }
8 u0 H9 y, S L" w( e$ T if ((c1==161) && (c2==161))//全角空格是个特例,另加处理" }0 c- r# {5 J# Y
{
# X2 {, J3 O3 P. N& p/ M str=str+" ";+ H# m, Z) S/ h4 N7 n% N
i++;8 U" v1 R1 ], M( V
continue;2 `8 x6 v! k- x+ B- C* }
} m, \9 @+ }7 r
str=str+ AnsiString(char(c1));7 o2 n. q) ]( u3 E$ B
}/ c& r- X9 G* X3 t+ P
Edit2->Text=str;3 c9 i# g; H% L
delete cTmp;cTmp=NULL;: }% @) @: `# b0 u: P
} </P>
4 m8 Y7 w% {6 |9 }! X8 s< > 以上代码C++Builder5.0/Win98 SE下编译通过。 9 B, J8 ]+ b! u& y( `
</P> |
zan
|