数学建模社区-数学中国
标题:
c++ builder:如何转换全角字符到半角字符?
[打印本页]
作者:
韩冰
时间:
2005-1-26 19:31
标题:
c++ builder:如何转换全角字符到半角字符?
<
>c++ builder:如何转换全角字符到半角字符?</P>
7 t) W% W8 p* p
<
> 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
/ |# i `7 K- _$ V0 ]% Q. B, g
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
6 [$ x! F) V! _& l& a
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
- b( |9 ?6 ^: }* e& Z
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
" K2 a+ L% S$ j! M: f2 J5 T( S
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
7 x& J2 c8 ~ h' a
我给出一个例程供大家参考。</P>
9 Z S; F1 `5 f
<
>
0 Z! W, U- ^. H+ s5 ^5 @
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
8 h6 e5 l" C% ~! y. Z
<
>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
$ q7 f" t$ g5 m% u
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
3 m4 I3 S: U5 L3 {
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
: D- z2 E0 ^4 c8 p
void __fastcall TForm1::Button1Click(TObject *Sender)
+ Z: u4 Q+ ` A0 c5 z5 G
{
) M a1 F1 i6 ]/ l a" ^
int nLength=Edit1->Text.Length();
4 H( N4 B3 ~# o( j% |4 {; X6 u# r1 C
if (nLength==0)
" M- B) J/ t# f
return;
+ c9 }+ ]0 s& w' i. g
AnsiString str="";
8 |! ?" _/ Y( `0 ^) {2 b
char *cTmp=new char[nLength+1];
7 i; k+ l, ~; L% D( y
StrPCopy(cTmp,Edit1->Text);
) M% l% Z( N% p8 p
BYTE c1,c2;
3 b( d, c* I( \+ F1 p1 m( f
int i;
" G+ V2 Y' H: h% w+ ]
for (i=0;i<nLength;i++)
4 M$ B# G4 L6 u
{
3 }8 P6 ?( c/ x3 R% F* a
c1=cTmp
;
V9 G5 z8 {% V8 ~! Q2 G
c2=cTmp[i+1];
7 K7 U& T% f1 t N6 p! D" O$ {
if (c1==163)//判断是否为全角字符
- {& W& X) ~. ]# ]
{</P>
' T. |" b% J n: W% U8 i, D P, D
<
> str=str+AnsiString((char)(c2-128));
+ o6 o4 ^% t2 l
i++;
( N% V5 Z# L) a* X- j
continue;
+ j$ P+ S4 k1 x0 M% v. H1 o
}
+ t4 j% A8 U; z$ c) e
if (c1>163)//判断是否为文字
1 U3 ]$ U+ k' G+ M& x7 {
{</P>
' o5 K$ c/ J' M; M; }
<
> str=str+AnsiString((char)c1);
/ V& G. q$ P7 ^1 y! L; T
str=str+AnsiString((char)c2);
8 u' h/ E3 A& B* F- f" C1 H
i++;
! A$ `, P" N! X5 {1 ~
continue;
+ f5 U6 i6 Q( V& _6 x, w% _
}
' B9 {4 H8 E) z3 q, P
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
0 y* s2 [4 ?: l- b' ?
{
0 Q, P1 f. d. E: i
str=str+" ";
5 R4 ]' {- r1 ~8 r3 k
i++;
. z9 D* m, `0 M
continue;
* K2 d' ^8 |# f% F
}
6 w5 P& ^" G) Y* q
str=str+ AnsiString(char(c1));
% ^7 t1 c6 s' k
}
+ C0 l' v9 c W+ A0 M0 a
Edit2->Text=str;
/ C. o2 Q) g+ {+ X' w
delete cTmp;cTmp=NULL;
0 K5 x: o9 {0 M- B/ q
} </P>
& d$ ?& h" J* |& ]
<
> 以上代码C++Builder5.0/Win98 SE下编译通过。
% o' S n9 o+ z
</P>
作者:
bllr.net
时间:
2011-12-29 11:26
来了的留个脚印
作者:
毛冲届
时间:
2012-1-7 10:06
提示:
作者被禁止或删除 内容自动屏蔽
作者:
qaz11sc0616
时间:
2012-6-1 09:44
顶......叹为观止.....
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5