全角和半角相互转换
目前,我们接触的汉字编码主要包括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);
}
注:本文内容来自网络上多篇文章,此处仅作资料收集,无版权限制,需要者可随意使用。