汉字转拼音:
采用哈希表方法,数组下标表示汉字的GB2312编码,存储内容为每个编码对应的汉字拼音,遇到一个汉字,先求其GB2312编码,然后根据编码快速得到汉字对应的拼音。
任意给定的文本文件可能是一个ASCII&GB2312混合编码的,其中ASCII编码是单字节表示,GB2312编码是双字节表示。在转化时,一次取一个字节,按以下步骤进行处理:
(1) 取一个字节,如果已没有字节可取(文件已处理完毕),则退出,否则,转向(2);
(2) 判断该字节是否为单字节,如果是单字节,则不做转化处理,回到下一步循环,即重复(1),否则转到(3);
(3) 取低字节,根据高字节和低字节联合判断是否为汉字字符,如果不是,则不做转化处理,转到(1),否则转到(4);
(4) 求其GB2312编码,根据编码得到对应拼音,然后转到(1)。
注:判断单字节的依据:高字节编码范围(即ASCII编码范围):(0x00<</span>高字节编码<0x80)
判断双字节汉字字符的依据:高字节+低字节(即GB2312中汉字字符编码范围):(0xb0<=高字节编码<=0xf7 && 0xa1<=低字节编码<=0xfe)
部分程序源码如下所示:
char ** pin = new char*[10000]; //数组下标为汉字的GB2312编码值,
//存储内容为每个编码对应的汉字拼音
pin[1]="a";
pin[2]="a";
pin[3]="ai";
... ...
ifstream fin(strTxtFileName); //待转化的文本文件
ofstream fout(strPinyinFileName); //转化后的拼音文件
char ch;
unsigned char ucHigh, ucLow; //分别存双字节字符的高低字节
int nCode; //存储汉字GB2312编码值
char* strValue; //转化得到的汉字拼音
while (!fin.eof()) {
//过滤单字节字符
ch = fin.get();
ucHigh = (unsigned char)ch;
if( ucHigh > 0x00 && ucHigh < 0x80)
continue;
//过滤掉双字节非中文字符
ch = fin.get();
ucLow = (unsigned char)ch;
if (ucHigh < 0xb0 || ucHigh >0xf7 || ucLow < 0xa1 || ucLow >0xfe)
continue;
//获取汉字GB2312编码
nCode = (ucHigh - 0xb0) * 100 + ucLow - 0xa0;
//根据汉字编码得到对应拼音
strValue = pin[nCode];
fout<<strValue<<"\n";
}
fin.close();
fout.close();
delete [] pin;
ASCII 码表:http://www.weste.net/tools/ASCII.asp
GB2312码表:http://www.knowsky.com/resource/gb2312tbl.htm