我们在手机上经常都能看到通过拼音缩写来搜索好友信息,那么它是如何将一段汉字转换为首字母大写呢
首先我们来了解一下中文在计算机中的结构。计算机识别的是字节,字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制。在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间
。而汉字在编码中都有自己专属的位置,比如说“A”
开头的汉字【啊、阿】
,它们的位置在45217 到 45252 之间(包括两端)
,那么我们就可以通过这个区间来对汉字进行分类,在45217 到 45252 之间就属于A,同理在45253 到 45760 之间的汉字就属于B。
private static string GetSpellCode(string CnChar)
{
long iCnChar;
byte[] arrCN = System.Text.Encoding.Default.GetBytes(CnChar);
//将传进来的参数转换为byte格式的,如果是英文字母,它的长度应该为1
//如果是中文,那它的长度应该是2
//如果是字母,则直接返回
if (arrCN.Length == 1)
{
CnChar = CnChar.ToUpper();
}
else
{
//是中文的话,长度就为2,分别接收到它的两个字节码
int area = (short)arrCN[0];
int pos = (short)arrCN[1];
//【<<】是位运算符,向左移动8位
iCnChar = (area << 8) + pos;
在这里用到了【<<】
这个运算符,【<<】
是位运算符中的左移运算符
。
它的作用是把一个整型数的所有位向左移动指定的位数,移动到左边界之外的多余二进制位会被丢弃,并从右边界移入0。左移运算的两个操作数应为整数类型。第一个操作数是要进行移位操作的数,第二个操作数指定第一个操作数移动的位数。如果第二个操作数等于0则不发生任何移位。
接下来我们就可以声明一个数组,将所有的区间放进去。
//声明字母字符串已经对应位置的区间数组
string letter = "ABCDEFGHJKLMNOPQRSTWXYZ";
int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614,
48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906,
51387, 51446, 52218, 52698, 52980, 53689, 54481, 55290 };
for (int i = 0; i < 23; i++)
{
//通过循环对比得到区间的位置,然后提取出相应位置的字母
if (areacode[i] <= iCnChar && iCnChar < areacode[i + 1])
{
CnChar = letter.Substring(i, 1);
break;
}
else
{
//如果无法识别(不在区间内,比如说¥、%、&等特殊符号)
//就将它统一归类为【#】
CnChar = "#";
}
}
}
return CnChar;
}
之后再写个方法调用它,为了实现多汉字的转换,我们还需要再写一个循环,依次对汉字词语进行转换再拼接
public static string GetFirstCode(string CnStr)
{
string strTemp = "";
int iLen = CnStr.Length;
//获取到字符串的长度
//通过循环,一次得到每个汉字的拼音首字母缩写
int i = 0;
for (i = 0; i <= iLen - 1; i++)
{
//拼接返回结果
strTemp += GetSpellCode(CnStr.Substring(i, 1));
}
return strTemp;
}