全角和半角相互转换

  目前,我们接触的汉字编码主要包括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);
}

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

原文地址:https://www.cnblogs.com/roea1/p/13282679.html