标签:频率 编码方式 程序 繁体 编码范围 特殊情况 特殊符号 区位码 编码
GBK是GB18030的子集(GB18030暂不追溯)。
GBK编码标准共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
GB2312简体中文编码表:http://tools.jb51.net/table/gb2312
GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。整个字符集分成94个区,每区有94个位。
GB2312是GBK的子集。GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。GB2312编码包括符号、数字、字母、日文、制表符等,当然最主要的部分还是中文,它采用16位编码方式,简体中文的编码范围从B0A1一直到F7FE。如果我们把该编码的每8位用十进制来表示就是[176 | 161]到[247 | 254],这样对于每个中文字符,我们都可以通过两个值来表示它,如“啊”就是[176 | 161],“我”则是[206 | 210]。
通过上面的方法,我们就可以通过一个二维坐标对每一个中文字进行定位,从而建立一个二维表来实现中文和拼音的对应关系。当然我们会忽略一些特殊情况,比如汉字的多音字问题。由于一个拼音可能对应多个汉字,而拼音的组合本来就不多,因此我们首先建立一个拼音音节表,代码如下,里面列出了所有可能的组合情况,该表是一维数组。
在上面提到的二维表中,我们会保存音节表的索引值,来对应一个音节组合,如bao,而不是直接把音节组合保存在二维数组中,这样可以有效减少内存消耗。因此,二位数组中的所有值都应该是索引值,如数组元素[176][161]对应的应该是a的索引值0。
以C#语言简例:
首先输入汉字“我”,首先程序初始化一个GB2312编码对象
System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("GB2312");
然后通过该对象获得“我”的编码数组
byte[] local = encoding.GetBytes(“我”);
local中的值应该是local[0]=206; local[1]=210。转换为十六进制,在CED2坐标位置可以找到“我”字。再查音节组合表,得索引值(可以根据具体需要修正索引)对应的是"wo",这样就完成了简体中文到拼音的转换。
由此可以想到多音字、或者GBK的转换会是怎样处理呢?有机会以后分解(当然方法不止一种)。
标签:频率 编码方式 程序 繁体 编码范围 特殊情况 特殊符号 区位码 编码
原文地址:http://www.cnblogs.com/zhaojihui/p/6624767.html