- 在线时间
- 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> G! |* k2 z4 w# ]8 h# q, ]/ Z
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
3 a/ u( }6 S) d+ t0 }节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则2 C$ f, H9 }* X+ w
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163; Z# F: P: m# {! P
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。5 z# {) |: e& O
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面" X7 C4 g9 w& C/ D- Z: u, Q
我给出一个例程供大家参考。</P>
1 C7 }5 A8 S0 K/ A5 o1 H< >
3 i2 M% k8 M; x8 {. k4 I3 q6 k4 F5 @ 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>; F @6 K- H7 R
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。
1 ]# f) z' h4 G3 u, Y5 b单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。# P0 k6 A' V% y* h" N( X, W' U& C
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
1 g4 L: X, M; \) e0 m5 kvoid __fastcall TForm1::Button1Click(TObject *Sender)
! I) C5 X' p- n( Z5 o{
W) P' E: X9 ~$ H1 o ^ int nLength=Edit1->Text.Length();& G- _, u9 q6 ~7 [
if (nLength==0)# ? x" f- w7 i1 ?
return;
4 t: G. B v, u AnsiString str="";3 u% u( \, ]. b+ t- ]
char *cTmp=new char[nLength+1]; l; ~, s% x1 q. E% N
StrPCopy(cTmp,Edit1->Text);
: W9 @6 c; B H4 z4 \ BYTE c1,c2;
B# j" L. ~% }- C! v int i;
1 l7 d. [/ ~( S7 q for (i=0;i<nLength;i++); w# P# x( e: r, C b. v' p
{
! j) A D7 ~, b/ } c1=cTmp;5 e9 ^7 t! d% L4 y. L6 i
c2=cTmp[i+1];! m2 p' @/ B4 W/ E' {, S$ g7 {
if (c1==163)//判断是否为全角字符
+ m9 B( ^0 n2 z {</P>
6 P0 ^% v1 X+ o5 ?& V* h< > str=str+AnsiString((char)(c2-128));) G3 h" W, C% I0 r. j
i++;
4 o; A" F5 [ W# Q/ B continue;
" f% [- k. `/ E9 y }% v1 Q' o' X. X {9 F b3 s! Z0 @
if (c1>163)//判断是否为文字7 I+ v) K N4 B u7 j
{</P>
" @" s, k. e8 O" a* T* T$ K0 u3 T< > str=str+AnsiString((char)c1);
% C7 J4 Z5 O3 C1 y str=str+AnsiString((char)c2);
% G" Q# W- q6 z' Y _' \ i++;
$ f& h5 G8 ]) j' _- ?& n1 n0 S2 q continue;
- `! i+ y0 _6 U- O9 X5 J% A }+ k8 a0 e/ O/ l H+ X
if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
/ g3 W/ H: p0 C* `% c3 [8 t {
2 g3 k& E( z. I7 m: Y! m7 G str=str+" ";" c' P8 V' q- Y! l7 V
i++;+ U' p& i# X8 k9 \/ E O3 H3 z
continue;' q8 y" ]; g# k M4 W6 c3 k/ g1 a
}
' _. `/ t$ ~: c/ }9 ] str=str+ AnsiString(char(c1));
2 \* s& ^, N7 _* ~' o$ U6 x }
4 e# W, q7 p4 T1 y- i- z( j+ g Edit2->Text=str;- x8 K9 v, I9 D1 C: C# t8 i
delete cTmp;cTmp=NULL;
: Z- q. [# h! u; l} </P>
- U1 B7 X I, ~' v1 L4 T< > 以上代码C++Builder5.0/Win98 SE下编译通过。 1 `2 N6 _! A$ p
</P> |
zan
|