- 在线时间
- 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>
" {% Q3 C1 X r< > 我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
3 R" w, S: x8 s% L/ R节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则+ R* V% S# z' [2 q6 s. [3 W
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163( \9 _5 v& n9 H' q0 Y) E
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
# h' x" L' k) x/ s# a7 c& I 以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
, o3 ^; _2 o$ S8 G2 w8 W5 X/ e4 J我给出一个例程供大家参考。</P>
6 @) \4 d5 `0 l _, _0 _& }< >
3 O$ _3 U* f8 r7 j4 R 新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>2 W2 l( o; Y5 O- T4 q7 s/ f* D
< >/*在Edit1中输入全角字符、中文、半角字符或混杂输入。7 s5 s: {, b3 o) s
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。% a- G, l% d: {( Y E: ^
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/
* y+ _( A: x+ v7 q& f- Avoid __fastcall TForm1::Button1Click(TObject *Sender)
@* f6 d, [+ l7 F' {3 X{
/ | X) S% K0 a; a7 d, m int nLength=Edit1->Text.Length();
& @8 A' O$ U% s if (nLength==0)2 i& b! s. v$ b9 ?9 P- V
return;% _: J! M# W$ ?4 `6 @( L
AnsiString str="";$ N) }: Y$ U0 n0 Q! A; e
char *cTmp=new char[nLength+1]; @! n& b" y: K% U2 P+ G
StrPCopy(cTmp,Edit1->Text);
6 T7 u `+ P& s- ` BYTE c1,c2;2 k: i, m0 N @% Q5 p
int i;$ a0 K$ {9 F: r5 X6 j
for (i=0;i<nLength;i++)% z3 U. w) m0 i! h3 z
{
' j4 Q" R" g7 T% @ c1=cTmp;
1 P. s% M; `8 K M c2=cTmp[i+1];
0 W) _* |# ~: G" f U, H if (c1==163)//判断是否为全角字符$ }; ?4 w# e( ?8 m! Z: c: k
{</P>2 i# a1 @/ T" K' Z% W/ \
< > str=str+AnsiString((char)(c2-128));- p" y' ]$ ]6 {5 d* u" D" P
i++;
, Z6 n, C: ]7 R continue;
2 h) d- A. n2 o- Q }
, c& O+ J, a( M9 [2 b if (c1>163)//判断是否为文字
+ `$ ]; f# U# l# v {</P>
- R: j3 ]: q5 M: ~6 c0 A- W< > str=str+AnsiString((char)c1);
: t& @, W0 E3 o8 L3 \ str=str+AnsiString((char)c2);
: q* n V- G( B. @) t, E$ h7 k n i++;
. g. e9 ^ | U" D4 _$ `7 p continue;
- U7 Y" ] p, C( }: L }
' V/ w1 R. q/ G: i% z3 E# | if ((c1==161) && (c2==161))//全角空格是个特例,另加处理" l( r6 M; A3 x5 q% N" v M, s
{
% i0 i0 u5 N$ X- }4 m2 X# W; w str=str+" ";$ R' Y4 ^) g) F* A( \5 [
i++;( [5 Z$ f, O; h4 H( a7 H9 e
continue;& ^7 T1 D3 J; K" ~6 T
}. S1 ~* J, p! X" m* |
str=str+ AnsiString(char(c1));
/ F8 L4 }3 p, k, ~ `" T* n }: g4 R7 ~$ t' k4 O
Edit2->Text=str;
& Y" b/ e& F/ F# ? ?" T; x delete cTmp;cTmp=NULL;
3 W1 K3 X) N S5 d) T) t+ W% a} </P>/ L& r1 Z8 Z5 E* Y) }
< > 以上代码C++Builder5.0/Win98 SE下编译通过。
, X/ ~6 k% N0 g, @: p4 l5 X( h</P> |
zan
|