static public string getSpell(string cn)
{
#region
byte[] arrCN = Encoding.Default.GetBytes(cn);
if (arrCN.Length > 1)
{
int area = (short)arrCN[0];
int pos = (short)arrCN[1];
int code = (area << 8) + pos;
int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };
for (int i = 0; i < 26; i++)
{
int max = 55290;
if (i != 25) max = areacode[i + 1];
if (areacode[i] <= code && code < max)
{
return Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
}
}
return "?";
}
else return cn;
#endregion
这是一段将汉字转为拼音的代码,我有几个地方不明白,请帮着看一下。
1、Encoding.Default.GetBytes(cn);这个能否祥解
2、int code = (area << 8) + pos;这个是什么意思呀
參考答案:{ 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };
这一串实际上是中文GBK编码码的十进制数值,GBK码是按照首个拼音字母的顺序来排放的,也就是说,这些其实是A,B,C...不同读音的分隔位置。例如45217代表的是“啊”(读音:a)字, 45253代表的是“芭”(读音:ba)字,b字头的第一个字。找到汉字在上面哪个编码区间,就相当于找到了拼音的首字母
Encoding.Default.GetBytes(cn)是用默认的编码方式把字符串的每个byte的值取出放入arrCN数组中。
int code = (area << 8) + pos;相当于把刚才两个独立的字节数据组装成为一个编码。
为什么要把两个字节组装起来?因为中文的编码都是需要两个字节的,实际上,传近来的中文字符串都是以两个字节为一个单位传进来的。
return Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
这个返回该文字的拼音的第一字母而已,因为ascii编码中,65是代表"A"
这个函数实际上是返回汉字的拼音的第一个字母的大写,并且一次只能处理一个汉字