全角字符与半角字符介绍及转换

全角字符与半角字符介绍及转换本文使用代码参考于https://www.cnblogs.com/leemang/p/3215499.html一、全角字符全角字符(Full-widthcharacters)指一个字符占用两个标准字符位置,汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符

大家好,欢迎来到IT知识分享网。

本文使用代码参考于https://www.cnblogs.com/leemang/p/3215499.html

一、全角字符

全角字符(Full-width characters)指一个字符占用两个标准字符位置,汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符。

二、半角字符

半角字符(Half-width characters)占用1个字节位置,可以由ASCII码表示

三、半角字符(标准字符)出现的原因

在计算机系统中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0);我们可以用我们的语言中的唯一符号映射唯一一个二进制数,这样我们就能在计算机中表达自己的意思了,比如用数字0来表示二进制数0011 0000 ,每个人都可以按照自己的想法设计一条映射规则(编码)。不过如果这样的话不同编码规则之间的交流就有很大的障碍了,不同的编码类似于各地的方言,没有经过学习就无法理解对方编码的意思。为了统一规范 ASCII(American Standard Code for Information Interchange, 美国信息交换标准代码)出现了。

ASCII是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

四、ASCII码

ASCII 码使用指定的7 位或8 位二进制组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。其中0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符)。

在标准ASCII中,其最高位(b7)用作奇偶校验。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,分为奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

五、计算机中的汉字的表示方法

我们可以发现使用128中组合就已经能够表示出全部的英文内容了,但是这个世界的语言不止英语一种,我们中国的汉字常用的就有几千个,区区256种是远远不够的,所以想要在计算机中表示汉字,我们需要寻找别的方式。

为了与ASCII码具有某种兼容性,同时解决中国等国家象形符号数量的问题,出现了双字节字符集。使用两个字节表示一个汉字,理论上最多可以表示 256 x 256 = 65536 个符号。当然肯定不是看起来这么简单的,我们汉字编码从1980年制定的GB2312-80(采用扩展 ASCII 码的编码空间进行编码,一个汉字占用两个字节,每个字节的最高位为 1) 标准到1995年制定的《汉字内码扩展规范》(GBK)(使用双字节编码,编码空间为 0x8140~0xFEFE,共有 23940 个码位,其中 GBK1 区和 GBK2 区也是 GB2312 的编码范围)到最后出现的GB18030编码标准《信息交换用汉字编码字符集基本集的补充》,编码容量不断扩大,直到能够完整包括所有的中国汉字。

现在我们知道汉字是由两个字节表示的,形象来说如果一次只能删除一字节内容的话要删两次才能删掉,一次只能删一半

全角字符与半角字符介绍及转换

 

 

 六、全角字符与半角字符举例

全角字符与半角字符介绍及转换

 

 七、在C语言中如何转换全角字符与半角字符

要解决全角转半角的问题,我们首先要知道,全角字符和半角字符是如何区分的。

通过查询规则我们知道全角字符的第一个字节总是等于163,第二个字节是相同半角字节加上128(空格除外)而中文的第一个字节是大于163的。

验证全角符号

#include <stdio.h>
  
int main(void)
{
    char strBuff[2 + 1] = "A";
    char firstch = strBuff[0];
    char secondch = strBuff[1];

    printf("字符A的第一个字节为[%0x]\n", firstch);
    printf("字符A的第二个字节为[%0x]\n", secondch);

    return 0;
}

结果如下:全角字符与半角字符介绍及转换

 

我们通过将字符&0xff的方式将低八位的数据取出来

全角字符与半角字符介绍及转换

 

进行一下进制转换

16进制的A3 = 十进制的163

16进制的C1 = 十进制的193

193 – 128 = 65

查询ASCII码表发现65就是大写字母A的ASCII值

验证全角空格的特殊性

全角字符与半角字符介绍及转换

 

 

 通过结果可以发现全角空格的两个字节都是十六进制的A1也就是十进制的161,而半角空格只有一个字节有值,值是十六进制的20也就是十进制的32

验证汉字

 全角字符与半角字符介绍及转换

 

 

 十六进制CD等于十进制203 大于163

由此,我们知道了全角字符与半角字符的转换规则可以开始设计我们的代码了

八、代码实现

全角字符转半角字符

关键点一、汉字

因为汉字就是双字节编码,所以没有转换的必要,要真砍了一字节看到的就都是乱码了

实现逻辑如下全角字符与半角字符介绍及转换

 

 

 

 

关键点二、空格

半角空格ASCII值32,十六进制值20,全角空格十六进制值A1A1

实现逻辑如下图

全角字符与半角字符介绍及转换

 

 

 

 

关键点三、其他可见字符

按照关系依次转换就好了

 

 

全角字符与半角字符介绍及转换

 

 

 完整代码

 

void FullToHalf(char *strBuff, char *strResult)
{
    for(; *strBuff; ++strBuff)
    {
        if((*strBuff & 0xff) == 0xA1 && (*(strBuff + 1) & 0xff) == 0xA1)        //全角空格
        {
            *strResult++ = 0x20;
            ++strBuff;
        }
        else if((*strBuff & 0xff) == 0xA3 &&
                (*(strBuff + 1) & 0xff) >= 0xA1 &&
                (*(strBuff + 1) & 0xff) <= 0xFE)//ASCII码中可见字符
        {
             *strResult++ = *++strBuff - 0x80;
        }
        else
        {
            if(*strBuff < 0)    //如果是中文字符,则拷贝两个字节
            {
                *strResult++ = *strBuff++;
            }
            *strResult++ = *strBuff;
        }
    }
    *strResult = 0;
}

同理是可实现半角转全角

半角字符转全角字符

void HalfToFull(char *strBuff, char *strResult)
{
    for(; *strBuff; ++strBuff)
    {
        if((*strBuff & 0xff) == 0x20)    //半角空格
        {
            *strResult++ = 0xA1;
            *strResult++ = 0xA1;
        }
        else if((*strBuff & 0xff) >= 0x21 && (*strBuff & 0xff) <= 0x7E)
        {
            *strResult++ = 0xA3;
            *strResult++ = *strBuff + 0x80;
        }
        else
        {
            if(*strBuff < 0)    //如果是中文字符,则拷贝两个字节
            {
                *strResult++ = *strBuff++;
            }
            *strResult++ = *strBuff;
        }
    }
    *strResult = 0;
}

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30197.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信