- 在线时间
- 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>
9 Y( _; k2 n) l* E- m4 x< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字! G7 l0 |: M1 S }' z
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
- u! z |9 h) Z5 R( u* O6 ~是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
0 E! R t/ S4 w6 J% w% X% t0 w/ x,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
. R+ a) c1 J- c& |6 L- f 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面1 ^" G& y% Y$ W
我给出一个例程供大家参考。</P> p* [8 L1 W% d% a; [6 l# s
< >
: O, b; D. x8 h, ~& D 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>2 a8 `. r& W2 c3 @( }6 \
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
0 u8 V6 r2 Y) K$ Z单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
6 s" G9 H' L) V! t注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/; U' D/ k% B, I3 p- t* N% ^
void __fastcall TForm1::Button1Click(TObject *Sender)4 l7 |: t1 n1 ~9 J0 j6 R- K$ l
{
* [* X7 Q7 w; ]# G- @( d9 p) ]# @9 ? int nLength=Edit1->Text.Length();& X: s3 V, C- f: F7 t8 [
if (nLength==0)
& S6 |9 R7 g6 I! n: P9 C7 }1 [ return;
! @. R7 [+ M9 P1 f. a AnsiString str="";% p6 i$ G+ ^7 @( h# i% ^6 A! V* j i
char *cTmp=new char[nLength+1];! q! v% Y. F+ F- M, ^! i, U' j
StrPCopy(cTmp,Edit1->Text);
7 v$ Q% x1 a& g, X: L8 i BYTE c1,c2;: ~; y; B# A$ e. q' I
int i;
8 c/ e, B S& N' x for (i=0;i<nLength;i++)7 h5 ?& N- B: X. j- a& \
{+ k8 H x$ L$ z" X3 _ C( t. i
c1=cTmp;. F- f' _0 w; U4 m: D+ I! m) K
c2=cTmp[i+1];
& s. W" M% `: }1 ?- h if (c1==163)//判断是否为全角字符. e& l2 t' y8 A# a& Z
{</P>0 {" n; X+ p0 C5 a
< > str=str+AnsiString((char)(c2-128));
3 _9 U' b- u% R0 d. S) } i++;
$ d' K0 I* @% b continue;4 T! q. W2 {/ q1 W) |
}6 \0 T! }3 E5 P6 Y. l# w! v9 j
if (c1>163)//判断是否为文字
; }- S- Z( A1 L2 z {</P>
0 w+ D' a( s- P$ G/ V7 N< > str=str+AnsiString((char)c1);
' M t p: d& P) h% R str=str+AnsiString((char)c2);
/ v. I2 u c' ^, r8 Q i++;& \' M0 |/ [1 Z1 l+ Q; N! V3 i$ n
continue;2 Q" D1 j; \7 S
}' r: ^6 |0 `0 y/ m, a& W/ J( y" ^9 n
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理6 @' f. o' C0 a" N) c, i2 ]
{! b5 \! K! l+ f$ T: X
str=str+" ";8 O2 u9 O" w5 ^- p
i++;
1 g5 P& ?8 m! g/ A. \3 A& d! ` continue;
9 u: c: p( B* k8 T" c7 }; ^ }) `% ~* l2 k. n+ y
str=str+ AnsiString(char(c1));
) d, B( b: |1 V }% M: I. a8 W8 T, h
Edit2->Text=str;$ K! z, E8 i6 \$ O/ k
delete cTmp;cTmp=NULL;
h }6 b4 t3 r} </P>
q6 f8 P6 h" \) v' z7 |* I) ^< > 以上代码C++Builder5.0/Win98 SE下编译通过。 ' w5 J8 P' L4 E0 P- d( y% T# E
</P> |
zan
|