- 在线时间
- 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>
7 u' h! V f; f8 i! M, f" t< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
% q! ]" d$ }' u; ^' G' ?! V节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
4 V6 B. V2 Y4 G) R- O. O' Y是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
; D% \% j/ e+ n, f* T3 K( e,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。1 W$ l% J: Z% Y+ @: N
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
; O2 I8 ~: T/ w6 D" e% ~5 y5 b我给出一个例程供大家参考。</P>+ C3 p; n u! D
< >
1 e% g1 j7 N1 Z D, @0 _, @4 [ 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
3 p$ ?$ ?8 F8 G( i& ~. N< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。9 z- v+ Q1 V3 x" Y
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
4 B( |% G6 U3 Z! V2 q" }注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/) U. ~) c$ o1 X! b z7 R
void __fastcall TForm1::Button1Click(TObject *Sender)
8 J; G4 |5 `4 U7 g{
) w, q" O/ Q9 u: F8 j# l0 N- T int nLength=Edit1->Text.Length();* P0 M* R5 ]0 ~( A v* D
if (nLength==0)
5 C5 t- }1 p+ j S; Y2 i0 z return;
' z; u" \6 Y- x: Y1 z AnsiString str="";
) Y. |2 x; H+ F" d char *cTmp=new char[nLength+1];
0 F2 c4 y3 d. z& A2 U6 |6 {6 _ StrPCopy(cTmp,Edit1->Text);
' [- a; H5 S, u6 {7 p BYTE c1,c2;, a5 j" h D2 v4 ~, F3 p4 b2 @8 {0 R
int i;2 C( g1 K T) [2 p$ R( ?" J
for (i=0;i<nLength;i++); ?0 F3 K; m4 w, K
{
" T. m. o3 G9 j9 @8 o* _9 ^ c1=cTmp;$ a7 g4 p3 B0 d' K) P' v
c2=cTmp[i+1];3 a1 e3 s3 U+ v+ a) k
if (c1==163)//判断是否为全角字符1 T. P- t; V3 A, D, O8 z" X" |' L
{</P>
5 n$ U5 Q7 q- [< > str=str+AnsiString((char)(c2-128));. m1 [" D! T% o. y4 I' O$ Y
i++;' x* |$ \3 Z, p1 }
continue;( \. B# R2 P# g1 k1 x" o; T
}
; w! A |& k, Z/ i. _ if (c1>163)//判断是否为文字
" }5 X6 z! y" { ^; x. \ {</P>
7 O4 R4 F& ^3 Y& ]$ m7 u D; K< > str=str+AnsiString((char)c1);: u' l2 ]7 C! J
str=str+AnsiString((char)c2);
% z$ y- t' X* @* a- { i++;
T* N$ r1 \. f; ^ continue;
+ ?5 Z0 o6 X* M3 P; ^5 q }( p5 e( n5 d* m' c3 F% N
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理3 B( b( E6 H; w) t( s8 C2 H
{# I" K7 `5 k8 ?# { U1 ]
str=str+" ";
6 l- g, Q7 ?) }! S. R+ C0 K' _ i++;* w! v; K2 c k! @5 Z& R. m
continue;! _' V" [$ g( O1 b% {% S
}
; p9 j6 s; I. O; h str=str+ AnsiString(char(c1));5 w$ o( G" T6 c
}
% j; o- |' l [" K Edit2->Text=str;% s4 F- i- i8 h* O! M
delete cTmp;cTmp=NULL;
' Y& Y: Q4 Q; x6 m} </P>$ V* I) v# E+ g) I/ ?2 ^3 z
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
' S; M7 Y7 t7 @8 P: o u# d</P> |
zan
|