数学建模社区-数学中国

标题: c++ builder:如何转换全角字符到半角字符? [打印本页]

作者: 韩冰    时间: 2005-1-26 19:31
标题: c++ builder:如何转换全角字符到半角字符?
<>c++ builder:如何转换全角字符到半角字符?</P>
' y# J! l" m/ n- T<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
7 A3 ?2 o1 o8 L" \; A节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则* Y+ D( ]0 V) x; c& e8 ^
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163& k) _7 c  p; d" \3 i2 h$ ?
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。2 H* f  R* ?3 }8 z2 h
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面" X* U: y, b7 S) ~( M
我给出一个例程供大家参考。</P>$ ~3 B( V6 H- `; I! x
<>9 B+ C/ y- y: b- P* p- W/ S
  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
" a* h3 }) ^, w* D/ Y/ l<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。" e' V" i( x4 |% {" m$ I: b
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
( u+ M' n- c9 j! G: ]7 {7 q) ]0 m注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/# S/ ?; @6 M% |* I( L( r
void __fastcall TForm1::Button1Click(TObject *Sender)7 B) g2 w* H, G- [5 J$ [7 n/ ]; u
{' L6 y0 M4 q3 W/ e( C2 Z
        int nLength=Edit1-&gt;Text.Length();% P, v- h( E" q. O0 W4 \
        if (nLength==0)
& S9 |" p3 u- ~) `! Q1 M                return;) P( T8 Q/ ~9 G" [; V( L/ y) a! b# V
        AnsiString str="";
+ i+ S9 l' n- }% O        char *cTmp=new char[nLength+1];
, G$ I& l* Z1 L- n        StrPCopy(cTmp,Edit1-&gt;Text);
- {( [6 [1 g* r1 E1 g8 z. l        BYTE c1,c2;
; @( a* @; a5 }        int i;0 G% |3 n0 G: h! d8 M4 \
        for (i=0;i&lt;nLength;i++)1 p0 e5 Z% o: F4 w1 I) S
        {
. c3 [& z/ z$ y                c1=cTmp;
4 }0 v  |& h; z( |& P) r                c2=cTmp[i+1];
# E; L; [6 @( K9 d                if (c1==163)//判断是否为全角字符
. ?  O$ m: I6 f6 B1 E) c                {</P>1 W: j) ^' l- o" y. e
<>                        str=str+AnsiString((char)(c2-128));" a3 r. d. u( x8 I+ Z
                        i++;
9 o) ~( e9 G3 M8 s6 v$ S$ K8 _                        continue;$ \: W! F, F( p! Z$ d9 w$ }2 K
                 }
8 P+ _/ k" ^0 W# B  D# I                if (c1&gt;163)//判断是否为文字8 v% h9 g! z* @" a, R$ O, u/ z
                {</P>
, K" s7 l6 z# x% c" @( F<>                        str=str+AnsiString((char)c1);
1 @+ y8 m- s6 @1 ]6 |                        str=str+AnsiString((char)c2);
4 I8 Z& f5 E# N: T( r5 P! G                        i++;6 N0 H6 ~( e/ q, G& e7 S
                        continue;
7 L0 q& k) |$ }' l0 m                }- R) s, c) j3 `% b% [
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
( ?3 l, j* b0 z/ j$ ?                        {
( T* Q& T' P  A4 l) f+ x                                str=str+" ";
' a1 A, y4 R8 _1 E  G& D                                i++;- B+ L/ {7 w4 d/ S$ p
                                continue;& a) s5 u2 p9 F% U: R' ?  q) {, X' U  Y
                        }4 i- s, M4 X# M- ?$ i$ ]8 x4 s
                str=str+ AnsiString(char(c1));
% J+ I1 p4 g" ^! }. Q$ s6 o        }% n% T, u1 H# W* Z; ?  t
        Edit2-&gt;Text=str;; M7 |* F" a. A- L# w# c
        delete cTmp;cTmp=NULL;* m' I" r( \- o7 Z4 s2 G) ~
} </P>
$ S" n: q' E, i$ z3 M<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
) |# R- H  Z+ @/ f1 e& v: ^" U</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