目前,我們接觸的漢字編碼主要包括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);
}
注:本文內容來自網絡上多篇文章,此處僅作資料收集,無版權限制,需要者可隨意使用。
