- 在线时间
- 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>' ^* ?+ F' R, j4 {) h
<> 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
9 ~* _; l. T9 L. @2 b节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
9 ]. x6 v) a2 h- s是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163% L% ] k3 U8 X- x
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。6 Y* d4 t( p4 g; d# h9 E
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
1 r. [2 o" x0 ?" }' t% X$ j我给出一个例程供大家参考。</P>
5 f- x7 h( q, m( y<>+ G7 B& {. k6 F& B
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P> V% k0 w2 `" @( t% v! Q% H. O
<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。8 h2 A" e6 y+ a* V$ m7 l) `
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。9 L5 V$ ^- k8 }3 e3 [" p
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
$ z/ p7 k- C8 d& u. o5 x9 kvoid __fastcall TForm1::Button1Click(TObject *Sender); X7 E' m: B' e& H# U
{
" Y0 a7 M' t g i int nLength=Edit1->Text.Length();2 k8 G* @+ G$ D
if (nLength==0)! L0 P2 R& [4 V& J+ c' T
return;
7 o7 v, ^# V: p% H0 ~ AnsiString str="";
8 O, A3 d8 V. ^. ~ char *cTmp=new char[nLength+1];
: z* k4 H3 i( G5 g# Y StrPCopy(cTmp,Edit1->Text);
8 {& b& G& F" B; x0 t BYTE c1,c2;
9 V7 b& P$ D" O( x; W k int i;9 ~* l1 I W2 Q+ L5 e( V& v
for (i=0;i<nLength;i++)2 `' C M$ \* u* n
{& M; L t$ v' ~
c1=cTmp;
3 T2 N Q9 c$ ? p6 x, O$ ] E c2=cTmp[i+1];1 A- r. J7 I! O# t* G) Z
if (c1==163)//判断是否为全角字符- X9 W0 l) C- X& ~/ {
{</P>
8 \! c+ G+ {2 z8 `' \1 q9 \* D( T9 g<> str=str+AnsiString((char)(c2-128));
$ J2 \# y }, m5 D5 f8 ~0 y/ I i++;! n! g: A7 r' b2 C( p
continue;4 N! B e+ @" {7 g' H/ K- R& ^
}% q1 c+ z9 m) R
if (c1>163)//判断是否为文字4 z6 R6 ^; f. _* |( \; g4 ^. u
{</P>
% t" P0 x4 S; r" e' S7 u8 W3 m7 c<> str=str+AnsiString((char)c1);
: ~0 s: m: o3 ?# E str=str+AnsiString((char)c2);% R9 z, b8 G& H7 q* O; m9 z8 g
i++;# ?* n+ i, b( r$ u+ O T8 @
continue;
# c' q* F5 v% U1 ^4 ~: L }
L( H' F5 j1 T* P9 Q2 ]' r. @ if ((c1==161) && (c2==161))//全角空格是个特例,另加处理7 N+ @4 V) y8 Q5 r! Y1 A: W
{
`; X, O! W1 g! q3 _% W str=str+" ";# _! y$ ]) ^8 l- ~$ Y; l$ s$ ~
i++;& b H8 D2 x/ O& {, u
continue;
1 o/ |6 ]% J& ^8 f6 d$ o6 H# w }7 w' c2 o% t1 a) n# f, b
str=str+ AnsiString(char(c1));
) `1 F( |* J% z% v5 |" e9 _( n( D }0 b0 @' ?) ^* N- v9 o0 j
Edit2->Text=str;
; ], K9 v$ s2 i* D% U$ x- L: b# p delete cTmp;cTmp=NULL;! \+ V/ T! {1 {8 n
} </P>& Z( B/ y4 `! F, D* S7 v
<> 以上代码C++Builder5.0/Win98 SE下编译通过。
8 ^. B G# h, c, I6 c# h- S</P> |
zan
|