如果您需要这个和我辛苦收集的更多类库,请到下面图片的水印免费下载
今天我们讲的这个汉字转换为拼音的类,在平时的项目中经常会用到,下面我们来讲下原理,首先我们定义两个字符串数组,getValue(用来保存所有拼音组合的unicode编码),getName(用来保存所有拼音组合),请大家看下面这两张图片:
我们拿getValue数组中的第一个元素-20319编码为例,他16进制后4位的编码正好对应汉字中的“啊”,拼音也正好对应getName数组中的第一个元素“A”。以此类推,两个数组都是一一对应的。
下面这张图就是功能函数的前半段了
首先创建了一个正则表达式的规则
Regex reg = new Regex("^[\\\\u4e00-\\\\u9fa5]$");
等下用它来验证是否输入的是汉字
下面这段主要就是申明一些等下要使用的变量,并且把输入的字符串拆分成一个一个的汉字保持到一个字符数组里面
byte[] arr = new byte[2];
string pystr = "";
int asc = 0, M1 = 0, M2 = 0;
char[] mChar = Chstr.ToCharArray();//获取汉字对应的字符数组
下面这段就是主要算出asc变量的值,一个汉字的内码有两个字节(这里仅仅讨论GB2312,不适用别的编码),可以用两个数字M1 M2表示,M2表示低字节,M1表示高字节。-65536是对它整体取补码,汉字内码规定,最高位必须是1。
我们用10进制打比方,一个2位数可以用2个1位数表示,比如27,可以知道M1=2,M2=7,现在怎么根据M1 M2还原回27呢?是不是2*10+7=27?(M1*10+M2)
一个10进制数字表示0~9,所以上一位就要乘以10。类似的,一个字节表示0~255(2的8次方-1),所以是M1*256+M2
arr = System.Text.Encoding.Default.GetBytes(mChar[j].ToString());//算出汉字的GB2312编码
M1 = (short)(arr[0]);//取GB2312的高字节
M2 = (short)(arr[1]);//取GB2312的低字节
asc = M1 * 256 + M2 - 65536;
排除英文或半角字符,遇到直接返回本来的字符
if (asc > 0 && asc < 160)
{
pystr += mChar[j];
}
下图就是根据asc变量的值将getName字符串中的拼音读取出来返回。
for (int i = (getValue.Length - 1); i >= 0; i--)
{
if (getValue[i] <= asc) //判断汉字的拼音区编码是否在指定范围内
{
pystr += getName[i];//如果不超出范围则获取对应的拼音
break;
}
}
好啦,就写道这里,如果你看下GB编码表就知道了,对于常用字,字的内码是根据拼音的顺序排列的,所以我们可以用查表的方法得到它的拼音,但是这个方法有缺陷,就是对于冷僻字,内码单独按照笔划排列,所以用这个方法是存在问题的。
如果您需要这个和我辛苦收集的更多类库,请到下面图片的水印免费下载
閱讀更多 源碼的誘惑 的文章