QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 13655|回复: 3
打印 上一主题 下一主题

c++ builder:如何转换全角字符到半角字符?

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
#
发表于 2005-1-26 19:31 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>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-&gt;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-&gt;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&lt;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&gt;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) &amp;&amp; (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-&gt;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
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信

4

主题

3

听众

656

积分

  • TA的每日心情
    开心
    2011-11-21 14:38
  • 签到天数: 41 天

    [LV.5]常住居民I

    群组数学建模培训课堂1

    群组数学建模培训课堂2

    群组2011年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    毛冲届        
    头像被屏蔽

    0

    主题

    4

    听众

    20

    积分

    该用户从未签到

    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    bllr.net        

    0

    主题

    0

    听众

    8

    积分

    升级  3.16%

    该用户从未签到

    自我介绍
    QQ个性签名
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-6 13:12 , Processed in 0.558980 second(s), 75 queries .

    回顶部