|
本帖最后由 songah 于 2010-6-25 09:01 编辑
在做上传时发现汉语无法实现上传,而且又不想改文件名,于是想到把汉语转成拼音,扩展Upload类,这里使用了论坛上一个拼音类
http://codeigniter.org.cn/forums ... =%E6%8B%BC%E9%9F%B3,不过使用起来发现效果不行,速度太慢,如果汉字超过十个基本就超时了,平均没转换一个汉字需要2s以上。然后还单独在控制器中做了测试,时间还是太慢。
PHP复制代码
class MY_Upload extends CI_Upload {
function MY_Upload ($props = array())
{
parent ::CI_Upload($props);
}
function _prep_filename ($filename)
{
$filenameReload = parent ::_prep_filename ($filename);
$ext = $this->get_extension($filenameReload);
$filenameOnly = str_replace($ext,'',$filenameReload);
if(preg_match("/[\x{4e00}-\x{9fa5}]+/u",$filenameOnly))
{
$CI = &get_instance ();
$CI->load->library('pinyin');
$CI->benchmark->mark('str2py');
$filenameOnly = $CI->pinyin->str2py($filenameOnly);
$CI->benchmark->mark('str2py_end');
}
return $filenameOnly.$ext;
}
}
复制代码
弄了很久,还是没有解决,然后忽然想到使用dedecms时那个转换速度非常不错,于是把dedecms的拼音转换函数拿过来试了一下,效果惊人,汉字的数目对于运行速度一点影响都没有,从1个汉字到十几个汉字都在1.5s以内完成。呵呵强悍吧。OK现在可以把下面那个函数放在helper中了,或者直接扩展到MY_Upload中,然后就可以把带汉字的文件名改为拼音了。当然也许可以在类中添加一个属性pinyins作为缓存——可以省去重复读取文件,这在dedecms中是通过定义全局变量实现的
PHP复制代码
function str2py ($word = '测试1')
{
$pinyin = $this->GetPinyin(iconv('UTF-8','GB2312',$word));
echo $pinyin;
}
function GetPinyin ($str,$ishead=0,$isclose=1)
{
$pinyins = array();
$restr = '';
$str = trim($str);
$slen = strlen($str);
if($slen<2)
{
return $str;
}
if(count($pinyins)==0)
{
//APPPATH下resources文件中有一个数据文件文件在附件中,解压缩放在application/resources/文件夹中就ok了
$fp = fopen(APPPATH .'/resources/pinyin.dat','r');
while(!feof($fp))
{
$line = trim(fgets($fp));
$pinyins[$line[0].$line[1]] = substr($line,3,strlen($line)-3);
}
fclose($fp);
}
for($i=0;$i<$slen;$i++)
{
if(ord($str[$i])>0x80)
{
$c = $str[$i].$str[$i+1];
$i++;
if(isset($pinyins[$c]))
{
if($ishead==0)
{
$restr .= $pinyins[$c];
}
else
{
$restr .= $pinyins[$c][0];
}
}else
{
$restr .= "_";
}
}else if( eregi("[a-z0-9]",$str[$i]) )
{
$restr .= $str[$i];
}
else
{
$restr .= "_";
}
}
if($isclose==0)
{
unset($pinyins);
}
return $restr;
}
复制代码 |
评分
-
查看全部评分
|