QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
5 E% m) b1 s, c9 a3 k5 i4 P5 L<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字0 X5 {6 t2 U0 K+ r& Y( t$ i
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
. D* P4 A# R8 i' l% d, k是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
* J* m% E: M! F: k( |8 z,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。) {. z4 B+ u. Z  r
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
& y# X- D' ~7 ^/ r/ y/ H% N" _& z我给出一个例程供大家参考。</P>( W: k- y, t. i: w4 v. r
<>
5 B0 t0 r  f3 E! ~3 q  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
) G7 j0 N* \: D' \0 ]: }6 _0 |( D6 n5 W<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。( g5 I7 h7 T. |1 D
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。3 h. C9 i. K- Y! _* F- U& c( y
注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/0 d. q, t) {" `* M
void __fastcall TForm1::Button1Click(TObject *Sender)& I' j/ N1 I/ }% a& N1 q
{
& J: f$ {7 I+ e& J% @" N4 V0 v' }        int nLength=Edit1-&gt;Text.Length();: v* r1 B) l, z+ p, p$ X- K0 x. t
        if (nLength==0)+ @  s* {& e: D7 R% ~) ^. z0 J
                return;
9 D5 E1 t, k/ S/ n& P9 n        AnsiString str="";
% }0 p( ?. l, k! n        char *cTmp=new char[nLength+1];
" o; R6 p2 U7 F" n- \& C' `        StrPCopy(cTmp,Edit1-&gt;Text);' L3 z/ O8 ^2 D* b+ O, w
        BYTE c1,c2;
7 S) x9 D; R- h! W, h- h! {        int i;
5 A, y$ Y- k0 ]1 u" J        for (i=0;i&lt;nLength;i++)4 J" ^/ W9 f! C/ ^' u
        {
: z8 Y7 j. a( b1 q+ _' `+ M2 E                c1=cTmp;
/ K6 j) |/ W, \+ Z                c2=cTmp[i+1];" D: g1 w# A" t; r
                if (c1==163)//判断是否为全角字符
7 {8 \; W1 m/ l* g: _. T' _+ |                {</P>
+ I5 M- H% t4 p. |. o<>                        str=str+AnsiString((char)(c2-128));
- s4 ^1 I. q* f# d% m# G                        i++;
- v* Q& F" z( _/ |) c) F                        continue;
& ^- j' v; _" ^                 }( t/ J! x. F1 H+ D, n
                if (c1&gt;163)//判断是否为文字
$ Q3 u! Y; C0 L- D5 H4 L9 m6 W                {</P>
- W! ]# [7 L; }( G<>                        str=str+AnsiString((char)c1);* N7 I1 O! h0 \5 \( A
                        str=str+AnsiString((char)c2);0 D. Y" t$ L" F% H- P6 ~
                        i++;
9 P6 F* P, j; e. l6 ~& v                        continue;
7 P) r) y0 A) v, Z                }# i2 a% g& n' c5 v
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理
4 e% B8 h: h: m; v6 H                        {: Q2 _3 T7 c$ g. Z
                                str=str+" ";, R8 r* F# E! a- \  v) _5 a
                                i++;
' k8 ?& j! H/ o+ Y0 k                                continue;
* d6 Q3 E$ Q& }/ b, e                        }
  f/ Y: }* l9 y                str=str+ AnsiString(char(c1));
3 p6 t; g4 p7 g8 Y        }
$ q# @9 A, ]+ h2 D        Edit2-&gt;Text=str;
' z1 V3 \  k& d. g9 q        delete cTmp;cTmp=NULL;
' s, I- s/ s, o} </P>0 m. `6 T4 q: X- l+ L. b
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
# L8 a' w6 ^% q9 j</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信
2#
无效楼层,该帖已经被删除
bllr.net        

0

主题

0

听众

8

积分

升级  3.16%

该用户从未签到

自我介绍
QQ个性签名
回复

使用道具 举报

毛冲届        
头像被屏蔽

0

主题

4

听众

20

积分

该用户从未签到

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

使用道具 举报

4

主题

3

听众

656

积分

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

    [LV.5]常住居民I

    群组数学建模培训课堂1

    群组数学建模培训课堂2

    群组2011年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

    6#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-18 07:27 , Processed in 0.707542 second(s), 81 queries .

    回顶部