全角和半角相互轉換


  目前,我們接觸的漢字編碼主要包括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);
}

 

注:本文內容來自網絡上多篇文章,此處僅作資料收集,無版權限制,需要者可隨意使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM