QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 19:31 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>c++ builder:如何转换全角字符到半角字符?</P>
7 u' h! V  f; f8 i! M, f" t<>  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ASCII Chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
% q! ]" d$ }' u; ^' G' ?! V节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角A为65,则全角A则
4 V6 B. V2 Y4 G) R- O. O' Y是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
; D% \% j/ e+ n, f* T3 K( e,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。1 W$ l% J: Z% Y+ @: N
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
; O2 I8 ~: T/ w6 D" e% ~5 y5 b我给出一个例程供大家参考。</P>+ C3 p; n  u! D
<>
1 e% g1 j7 N1 Z  D, @0 _, @4 [  新建窗体,在窗体上放置Button1、Edit1、Edit2。</P>
3 p$ ?$ ?8 F8 G( i& ~. N<>/*在Edit1中输入全角字符、中文、半角字符或混杂输入。9 z- v+ Q1 V3 x" Y
单击Button1,Edit1中的文字显示到Edit2中并转换了所有的全角字符。
4 B( |% G6 U3 Z! V2 q" }注意,程序没有对特殊字符如255(按住ALT再按小键盘的2、5、5输入)等作出正确反应。*/) U. ~) c$ o1 X! b  z7 R
void __fastcall TForm1::Button1Click(TObject *Sender)
8 J; G4 |5 `4 U7 g{
) w, q" O/ Q9 u: F8 j# l0 N- T        int nLength=Edit1-&gt;Text.Length();* P0 M* R5 ]0 ~( A  v* D
        if (nLength==0)
5 C5 t- }1 p+ j  S; Y2 i0 z                return;
' z; u" \6 Y- x: Y1 z        AnsiString str="";
) Y. |2 x; H+ F" d        char *cTmp=new char[nLength+1];
0 F2 c4 y3 d. z& A2 U6 |6 {6 _        StrPCopy(cTmp,Edit1-&gt;Text);
' [- a; H5 S, u6 {7 p        BYTE c1,c2;, a5 j" h  D2 v4 ~, F3 p4 b2 @8 {0 R
        int i;2 C( g1 K  T) [2 p$ R( ?" J
        for (i=0;i&lt;nLength;i++); ?0 F3 K; m4 w, K
        {
" T. m. o3 G9 j9 @8 o* _9 ^                c1=cTmp;$ a7 g4 p3 B0 d' K) P' v
                c2=cTmp[i+1];3 a1 e3 s3 U+ v+ a) k
                if (c1==163)//判断是否为全角字符1 T. P- t; V3 A, D, O8 z" X" |' L
                {</P>
5 n$ U5 Q7 q- [<>                        str=str+AnsiString((char)(c2-128));. m1 [" D! T% o. y4 I' O$ Y
                        i++;' x* |$ \3 Z, p1 }
                        continue;( \. B# R2 P# g1 k1 x" o; T
                 }
; w! A  |& k, Z/ i. _                if (c1&gt;163)//判断是否为文字
" }5 X6 z! y" {  ^; x. \                {</P>
7 O4 R4 F& ^3 Y& ]$ m7 u  D; K<>                        str=str+AnsiString((char)c1);: u' l2 ]7 C! J
                        str=str+AnsiString((char)c2);
% z$ y- t' X* @* a- {                        i++;
  T* N$ r1 \. f; ^                        continue;
+ ?5 Z0 o6 X* M3 P; ^5 q                }( p5 e( n5 d* m' c3 F% N
                if ((c1==161) &amp;&amp; (c2==161))//全角空格是个特例,另加处理3 B( b( E6 H; w) t( s8 C2 H
                        {# I" K7 `5 k8 ?# {  U1 ]
                                str=str+" ";
6 l- g, Q7 ?) }! S. R+ C0 K' _                                i++;* w! v; K2 c  k! @5 Z& R. m
                                continue;! _' V" [$ g( O1 b% {% S
                        }
; p9 j6 s; I. O; h                str=str+ AnsiString(char(c1));5 w$ o( G" T6 c
        }
% j; o- |' l  [" K        Edit2-&gt;Text=str;% s4 F- i- i8 h* O! M
        delete cTmp;cTmp=NULL;
' Y& Y: Q4 Q; x6 m} </P>$ V* I) v# E+ g) I/ ?2 ^3 z
<>  以上代码C++Builder5.0/Win98 SE下编译通过。                        
' S; M7 Y7 t7 @8 P: o  u# d</P>
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持1 反对反对0 微信微信
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年第一期数学建模

    群组科技写作基础培训

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-7-17 19:23 , Processed in 0.698448 second(s), 72 queries .

    回顶部