一个笨方法,解决中文名乱码问题

一个笨方法,解决中文名乱码问题

XX Niu發表於
Number of replies: 0

中文名是偶数没问题奇数则乱码,用了比较笨的解决办法 在中文的末尾加一个下划线。

本想根据中文字奇偶数来判断 可是那样效率会更低。我发现文件夹或文件名中被.间隔的小段都有奇数中文乱码的问题。修改后“中.abc.中."这样的变态名也可以处理了。目前测试没有问题(1.82版)。

修改lib\moodlelib.php 4142行左右的clean_filename函数

参考代码如下:

function clean_filename($string) {
     global $CFG;
     if (empty($CFG->unicodecleanfilename)) {
         $textlib = textlib_get_instance();
         $string = $textlib->specialtoascii($string);
         $string = preg_replace('/[^\.a-zA-Z\d\_-]/','_', $string ); // only allowed chars
     } else {
         //clean only ascii range
         $string = preg_replace("/[\\000-\\x2c\\x2f\\x3a-\\x40\\x5b-\\x5e\\x60\\x7b-\\177]/s", '_', $string);
     }
     $string = preg_replace("/_+/", '_', $string);
     $string = preg_replace("/\.\.+/", '.', $string);


//以下为添加内容

$pot=strrpos( $string, "." );       //取得最后一个.的位置
if (!$pot){                               //没有.直接清理
$string=cnname($string);
}
else
{

$string1=substr($string,0,$pot); //在最后一个.处截为2段
$string2= substr($string,$pot);
$string1=str_replace(".","_",$string1);//最后一个.的前面如果还有. 一定不是标示扩展名的.那么一起换成_
$string=cnname($string1).cnname($string2);//分别清理前后2段并再合到一起
}
     return $string;
}

function cnname($string){
//strongadd
      $ccLen=0;
      $ascLen=strlen($string);
      $ind=0;

    if (substr($string,strlen($string)-1,1)!='_')
{
      for($ind=0;$ind<$ascLen;$ind++)
      {
          if(ord(substr($string,$ind,1))>127)
    {
               $string=$string.'_';//srong add
     break;
    }
      }
   }
   return $string;
}

評比平均分數: -