- 在线时间
- 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>
5 E% m) b1 s, c9 a3 k5 i4 P5 L< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字0 X5 {6 t2 U0 K+ r& Y( t$ i
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
. D* P4 A# R8 i' l% d, k是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
* J* m% E: M! F: k( |8 z,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。) {. z4 B+ u. Z r
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
& y# X- D' ~7 ^/ r/ y/ H% N" _& z我给出一个例程供大家参考。</P>( W: k- y, t. i: w4 v. r
< >
5 B0 t0 r f3 E! ~3 q 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
) G7 j0 N* \: D' \0 ]: }6 _0 |( D6 n5 W< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。( g5 I7 h7 T. |1 D
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。3 h. C9 i. K- Y! _* F- U& c( y
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/0 d. q, t) {" `* M
void __fastcall TForm1::Button1Click(TObject *Sender)& I' j/ N1 I/ }% a& N1 q
{
& J: f$ {7 I+ e& J% @" N4 V0 v' } int nLength=Edit1->Text.Length();: v* r1 B) l, z+ p, p$ X- K0 x. t
if (nLength==0)+ @ s* {& e: D7 R% ~) ^. z0 J
return;
9 D5 E1 t, k/ S/ n& P9 n AnsiString str="";
% }0 p( ?. l, k! n char *cTmp=new char[nLength+1];
" o; R6 p2 U7 F" n- \& C' ` StrPCopy(cTmp,Edit1->Text);' L3 z/ O8 ^2 D* b+ O, w
BYTE c1,c2;
7 S) x9 D; R- h! W, h- h! { int i;
5 A, y$ Y- k0 ]1 u" J for (i=0;i<nLength;i++)4 J" ^/ W9 f! C/ ^' u
{
: z8 Y7 j. a( b1 q+ _' `+ M2 E c1=cTmp;
/ K6 j) |/ W, \+ Z c2=cTmp[i+1];" D: g1 w# A" t; r
if (c1==163)//判断是否为全角字符
7 {8 \; W1 m/ l* g: _. T' _+ | {</P>
+ I5 M- H% t4 p. |. o< > str=str+AnsiString((char)(c2-128));
- s4 ^1 I. q* f# d% m# G i++;
- v* Q& F" z( _/ |) c) F continue;
& ^- j' v; _" ^ }( t/ J! x. F1 H+ D, n
if (c1>163)//判断是否为文字
$ Q3 u! Y; C0 L- D5 H4 L9 m6 W {</P>
- W! ]# [7 L; }( G< > str=str+AnsiString((char)c1);* N7 I1 O! h0 \5 \( A
str=str+AnsiString((char)c2);0 D. Y" t$ L" F% H- P6 ~
i++;
9 P6 F* P, j; e. l6 ~& v continue;
7 P) r) y0 A) v, Z }# i2 a% g& n' c5 v
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
4 e% B8 h: h: m; v6 H {: Q2 _3 T7 c$ g. Z
str=str+" ";, R8 r* F# E! a- \ v) _5 a
i++;
' k8 ?& j! H/ o+ Y0 k continue;
* d6 Q3 E$ Q& }/ b, e }
f/ Y: }* l9 y str=str+ AnsiString(char(c1));
3 p6 t; g4 p7 g8 Y }
$ q# @9 A, ]+ h2 D Edit2->Text=str;
' z1 V3 \ k& d. g9 q delete cTmp;cTmp=NULL;
' s, I- s/ s, o} </P>0 m. `6 T4 q: X- l+ L. b
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
# L8 a' w6 ^% q9 j</P> |
zan
|