zoukankan      html  css  js  c++  java
  • 全角和半角相互转换

      目前,我们接触的汉字编码主要包括GBK和GB2312。其中,GB2312又称国标码,它是一个简化字的编码规范,也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。而GBK是GB2312的扩展,是向上兼容的,GB2312中的汉字的编码与GBK中汉字的相同,只不过GBK中还包含繁体字的编码。GBK中每个汉字仍然占用两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。因此,下面的代码也是在使用GB2312或GBK编码的环境下测试通过。

      

    //C语言
    //全角转半角
    void sbc_to_dbc(char *sbc, char *dbc)
    {
        for(; *sbc; ++sbc)
        {
            if((*sbc & 0xff) == 0xA1 && (*(sbc + 1) & 0xff) == 0xA1)        //全角空格
            {
                *dbc++ = 0x20;
                ++sbc;
            }
            else if((*sbc & 0xff) == 0xA3 && (*(sbc + 1) & 0xff) >= 0xA1 && (*(sbc + 1) & 0xff) <= 0xFE)    //ASCII码中其它可显示字符
                *dbc++ = *++sbc - 0x80;
            else
            {
                if(*sbc < 0)    //如果是中文字符,则拷贝两个字节
                    *dbc++ = *sbc++;
                *dbc++ = *sbc;
            }
        }
        *dbc = 0;
    }

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

    //C++中的半角、全角字符转换
    //全角字符占用2个字符位置,半角字符(Half-width characters)占用1个字符位置。他们在应用上的区别主要表现在输入阿拉伯数目字、英文字母、标点符号、特殊符号,这些只需要占1个字符位的一般用半角输入。如果用全角输入的话,每两个字符之间就会产生一个空格。

    //半角转全角
    std::string ToFull(std::string str)
    {
     std::string result = "";
     unsigned char tmp;
     unsigned char tmp1;
     for (unsigned int i = 0; i < str.length(); i++)
     {
      tmp = str[i];
      tmp1 = str[i + 1];
      //cout << "uchar:" << (int) tmp << endl;
      if (tmp>32 && tmp<128)
      {//是半角字符
       result += 163;//第一个字节设置为163
       result += (unsigned char)str[i]+128;//第二个字节+128;
      }
      else if (tmp >= 163)
      {//是全角字符
       result += str.substr(i, 2);
       i++;
       continue;
      }
      else if (tmp == 32)
      {//处理半角空格
       result += 161;
       result += 161;
      }
      else
      {
       result += str.substr(i, 2);
       i++;
      }
     }
     return result;
    }

    //全角转半角
    string ToHalf(string str)
    {
        string result = "";
        unsigned char tmp;
        unsigned char tmp1;
        for (unsigned int i = 0; i < str.length(); i++)
        {
            tmp = str[i];
            tmp1 = str[i + 1];
            cout << "uchar:" << (int) tmp << endl;
            if (tmp == 163) {///第一个字节是163,标志着是全角字符
                result += (unsigned char) str[i + 1] - 128;
                i++;
                continue;
            } else if (tmp > 163) {//汉字
                result += str.substr(i, 2);
                i++;
                continue;
            } else if (tmp == 161 && tmp1 == 161) {///处理全角空格
                result += "";
                i++;
            }
            else
            {
                result += str.substr(i, 1);
            }
        }
        return result;
    }


    //C# 语言
    public static string ToSBC(string input)
    {
        //半角转全角
        char[] array = input.ToCharArray();
        for (int i = 0; i < array.Length; i++)
        {
            if (array[i] == 32)
            {
                array[i] = (char)12288;
                continue;
            }
            if (array[i] < 127)
            {
                array[i] = (char)(array[i] + 65248);
            }
        }

        return new string(array);
    }

    public static string ToDBC(string input)
    {
        //全角转半角
        char[] array = input.ToCharArray();
        for (int i = 0; i < array.Length; i++)
        {
            if (array[i] == 12288)
            {
                array[i] = (char)32;
                continue;
            }
            if (array[i] > 65280 && array[i] < 65375)
            {
                array[i] = (char)(array[i] - 65248);
            }
        }

        return new string(array);
    }

    注:本文内容来自网络上多篇文章,此处仅作资料收集,无版权限制,需要者可随意使用。

  • 相关阅读:
    c++ 视频和教程下载站点
    SQL超时解决方法
    初学者必备:C++经典入门详细教程
    人生致命的八个经典问题
    字长与字节
    typedef用法(三)
    遍历搜索注册表
    数据库连接字符串大全 之 SQL服务器篇
    十五个步骤收获学习的习惯
    谈基于.net平台windows开发中的模式窗体.NET教程,.NET Framework
  • 原文地址:https://www.cnblogs.com/roea1/p/13282679.html
Copyright © 2011-2022 走看看