最近使用到汉字到拼音的转换,因此在众多搜索结果干扰项中探得此文。由于原文思路清晰,观点独特,故转载于此。本文实质上使用的是查表法,全文内容基本上是字典的获取方法
注意:本文转自 http://blog.verycd.com/dash/cmd=showentry&eid=1677 ,以下为原文
细心的网友可能会发现,VeryCD的资源搜索是支持拼音的,不论你是直接输入拼音,还是输入同音字,我们的搜索程序都会提示你正确的关键字。比如: http://search.verycd.com/search?q=萧雅轩 (注:此链接已经过时)
之前我们使用的是一个网上已经很普遍的汉字转拼音函数,通过使用后发现,这个函数的算法虽然简便,但只能取得GB2312中根据拼音排列的3755个常用汉字,所以其适用范围很有限。由于其它汉字大都按部首/笔画顺序排列,所以我们只能通过建立一个汉字-拼音表来实现一一对应。
这个时候输入法生成器就派上了用场,利用它的逆转换功能生成一个汉字拼音的文本文件。然后再写一个PHP小程序,即可删除这个文本文件中的词组和多音字。
附注:我们在最后处理的时候忽略了多音字的因素,以后仍然有待改进。
网上关于正则判断中文的文章大都使用[chr(0xa1)-chr(0xff)]来判断中文,事实上这只能判断出GB2312的几千个汉字,生僻字和繁体字都不包含在内,正确的应该是[chr(0x81)-chr(0xfe)]。
注:原附件已被删除,本文仅提供原理。
注意:本文转自 http://blog.verycd.com/dash/cmd=showentry&eid=1677 ,以下为原文
细心的网友可能会发现,VeryCD的资源搜索是支持拼音的,不论你是直接输入拼音,还是输入同音字,我们的搜索程序都会提示你正确的关键字。比如: http://search.verycd.com/search?q=萧雅轩 (注:此链接已经过时)
之前我们使用的是一个网上已经很普遍的汉字转拼音函数,通过使用后发现,这个函数的算法虽然简便,但只能取得GB2312中根据拼音排列的3755个常用汉字,所以其适用范围很有限。由于其它汉字大都按部首/笔画顺序排列,所以我们只能通过建立一个汉字-拼音表来实现一一对应。
这个时候输入法生成器就派上了用场,利用它的逆转换功能生成一个汉字拼音的文本文件。然后再写一个PHP小程序,即可删除这个文本文件中的词组和多音字。
1
<?php
2
//注意,在2000/XP下生成的文本文件是Unicode格式,需要先转换到GB2312
3
$py = file_get_contents("WINPY.TXT");
4
$arr_tmp = explode("\r\n", $py);
5
$arr_py = array();
6
foreach ($arr_tmp as $v)
7
{
8
if (preg_match("/^[".chr(0x81)."-".chr(0xfe)."].[a-z]/", $v))
9
{
10
$word = substr($v, 0, 2);
11
if (!$arr_py[$word])
12
{
13
$arr_py[$word] = substr($v, 2);
14
$output .= $v."\n";
15
}
16
}
17
}
18
$handle = fopen("WINPY2.TXT", 'w');
19
fwrite($handle, $output);
20
?>
通过读入WINPY2.TXT再配合几个字符串操作函数就可以非常简单的获取到汉字的拼音了(具体的代码xdanger还在写,我这里就不贴出来了)![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
附注:我们在最后处理的时候忽略了多音字的因素,以后仍然有待改进。
网上关于正则判断中文的文章大都使用[chr(0xa1)-chr(0xff)]来判断中文,事实上这只能判断出GB2312的几千个汉字,生僻字和繁体字都不包含在内,正确的应该是[chr(0x81)-chr(0xfe)]。
注:原附件已被删除,本文仅提供原理。