- 在线时间
- 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>" S/ R( j3 Y) E @
< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
2 h7 G8 K) N; N, q0 v5 l: y$ H节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则! p# v8 l# x5 P3 i9 D9 U1 q0 M
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
) _4 a( e- M3 A,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。; l" y; K. \# J6 r
以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
, i$ @7 F* v6 d. Z b+ G我给出一个例程供大家参考。</P>
2 ` m- e$ D& b& ?# }< ># @" g* W u: @0 C
新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
" J7 n0 A9 [4 q: b# G& e2 q3 }< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。9 \$ B& s4 e6 h) o* i
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
2 x' R1 p: j, z" \; t) h0 ~! C注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/. G1 Z) w* C6 o' Y. D+ `
void __fastcall TForm1::Button1Click(TObject *Sender)
7 H* L( Y# v" R) ^! R, \! w2 l4 ?: a+ w{
+ K, q/ q+ A n0 Q4 v" F int nLength=Edit1->Text.Length();
8 L& I. L% Q: Y if (nLength==0)
6 k! r- E4 e& v+ h! u6 S P return;4 v) U8 p$ Y. D
AnsiString str="";" k/ R! |. G) x9 f6 f; O, |
char *cTmp=new char[nLength+1];
9 [* s: f# g+ u8 s8 `- F0 L StrPCopy(cTmp,Edit1->Text);
}" f- g w& p, J BYTE c1,c2;
! K! K6 I7 b3 _) K& `0 \+ {) ?; ?6 o int i;. l; e$ |# f- ~' C. ^6 B
for (i=0;i<nLength;i++)
' _; S5 W: A+ v1 j, V. \3 Q* o4 x {* X- L7 J7 h0 L7 T
c1=cTmp;
9 L! l9 T5 N4 s3 {. ]0 z' R& s9 J c2=cTmp[i+1];5 t3 t/ O( F7 [9 [& ~8 m2 ]
if (c1==163)//判断是否为全角字符! s3 N+ j( E2 e/ M) f
{</P>
, B0 H6 C" @, P< > str=str+AnsiString((char)(c2-128));
7 ?. a/ C' w X* h3 h i++;3 L" D& |2 @1 m6 ^; g6 Z
continue;
* g' N+ D" p) q% N6 B }) P5 c& W) z) y" A2 {+ u4 Y+ }" _
if (c1>163)//判断是否为文字. x R t* t+ d- ~* M
{</P> D9 s" o2 g, g- Q- _
< > str=str+AnsiString((char)c1);. } r) ^- ?9 C
str=str+AnsiString((char)c2);" K. {( d3 z }
i++;* c: F- Z1 e. ?$ s
continue;
0 M0 `8 j1 L% y* M) ^ }
% ]- S9 E6 z3 I4 e r! b4 \& x% J if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
: g7 }3 A4 ^. N5 S8 y" _ {( B. y- J, ^1 f: Z: T _
str=str+" ";. K0 M7 Q; @5 K
i++;% a0 ]5 P J) c" c
continue;
- {; U6 I: T- _; U' i4 a/ Z3 Q! C }* }# x# C9 P! n; e- D
str=str+ AnsiString(char(c1));* ` Q1 A/ n) ^/ C( T
}
2 m! f9 l; v, E% E. B5 D+ P* t3 ` Edit2->Text=str;' c/ m. X4 ?" i8 r/ j
delete cTmp;cTmp=NULL;
8 i5 b# Y, e3 p0 m5 u, s3 i} </P>
( S# }& ]5 F4 v6 n' |< > 以上代码C++Builder5.0/Win98 SE下编译通过。
% ]1 L0 s1 E+ N8 ]</P> |
zan
|