基本都能看懂吧?$dir = isset($_REQUEST['lib'])&&$_REQUEST['lib'] == 'yui' ? '../../../' : '../../';//这个你可以注释掉了,这个可以用来取当前WEB路径的
 $dir = "C:\\";//这里就是你遍历的硬盘上的绝对路径,当然只能是对本机有效
$node = isset($_REQUEST['node'])?$_REQUEST['node']:"";//看到这个NODE应该只到是节点的意思了吧
if(strpos($node, '..') !== false){
    die('Nice try buddy.');
}
$nodes = array();//这里定义一个数组,这个数组用来存放遍历的目录以及文件
$d = dir($dir.$node);//取节点
while($f = $d->read()){//循环读节点,下面就是那些就是读节点判断是目录还是文件,并去目录或文件的一些相关信息
    if($f == '.' || $f == '..' || substr($f, 0, 1) == '.')continue;
    $lastmod = date('M j, Y, g:i a',filemtime($dir.$node.'/'.$f));
    if(is_dir($dir.$node.'/'.$f)){
        $qtip = 'Type: Folder<br />Last Modified: '.$lastmod;
        $nodes[] = array('text'=>$f, 'id'=>$node.'/'.$f/*, 'qtip'=>$qtip*/, 'cls'=>'folder');
    }else{
        $size = formatBytes(filesize($dir.$node.'/'.$f), 2);
        $qtip = 'Type: JavaScript File<br />Last Modified: '.$lastmod.'<br />Size: '.$size;
        $nodes[] = array('text'=>$f, 'id'=>$node.'/'.$f, 'leaf'=>true/*, 'qtip'=>$qtip, 'qtipTitle'=>$f */, 'cls'=>'file');
    }
}
$d->close();

解决方案 »

  1.   

    function formatBytes($val, $digits = 3, $mode = "SI", $bB = "B"){ //$mode == "SI"|"IEC", $bB == "b"|"B"
       $si = array("", "K", "M", "G", "T", "P", "E", "Z", "Y");
       $iec = array("", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi");
       switch(strtoupper($mode)) {
           case "SI" : $factor = 1000; $symbols = $si; break;
           case "IEC" : $factor = 1024; $symbols = $iec; break;
           default : $factor = 1000; $symbols = $si; break;
       }
       switch($bB) {
           case "b" : $val *= 8; break;
           default : $bB = "B"; break;
       }
       for($i=0;$i<count($symbols)-1 && $val>=$factor;$i++)
           $val /= $factor;
       $p = strpos($val, ".");
       if($p !== false && $p > $digits) $val = round($val);
       elseif($p !== false) $val = round($val, $digits-$p);
       return round($val, $digits) . " " . $symbols[$i] . $bB;
    }
    是这部分不懂啊,大侠
      

  2.   


    测了一下,PHP读中文目录是没问题的
    但你用ext ,那是js的问题,你传值时会有字符编码问题,
    这个编码统一就行了!或者进行一下转码!
      

  3.   


    header("Content-Type: text/html; charset=utf-8");
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");function __jsonText($array)
    {
    $str = "{";
    foreach($array as $key=> $value)
    {
    $value = str_replace("\"", "\\\"", $value);
    if($str != "{") $str.=",";
    $str .= "$key: " . "\"$value\"";
    }
    $str .= "}";
    return $str;
    }
    $strNode = "";foreach($nodes as $key=>$value)
    {
    $strNode .= __jsonText($value) . ","; 
    }
    $strNode = sprintf('[%s]', iconv('gb2312', 'utf-8', rtrim($strNode, ',')));
    echo $strNode;替换 
    $json = new Services_JSON(); 
    echo $json->encode($nodes); 
    这两句.reorder.html
    改了
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">但ext没有对中文编码,所以很郁闷,呵呵.能显示,但还是不能处理.
      

  4.   

    encode
    是这个函数在做转换的时候出了问题!
      

  5.   

    /**
        * convert a string from one UTF-16 char to one UTF-8 char
        *
        * Normally should be handled by mb_convert_encoding, but
        * provides a slower PHP-only method for installations
        * that lack the multibye string extension.
        *
        * @param    string  $utf16  UTF-16 character
        * @return   string  UTF-8 character
        * @access   private
        */
    英文看不是太懂
      

  6.   

    就是写成树的时候就乱码了
    get-nodes.php
    直接看这个文件的时候还没任何问题
    应该是ext 对中文处理不好
      

  7.   

    我怀疑是JSON对中文支持不够好...
      

  8.   

    JSON对中文支持也不好,按照我的替换方式,是可以显示中文目录的,但仅限于显示.
    ext对中文的URL地址没有编码,导致不能显示中文目录下面的文件和目录!
      

  9.   

    但网上已经有EXT-js动态生成树并正确显示中文的例子:http://blog.sina.com.cn/s/blog_4a8e3c610100bf24.html,不知道他们是怎么实现的
      

  10.   


    $node = iconv('utf-8', 'gb2312', $node);
    $nodes = array();
    $d = dir($dir.$node);
    while($f = $d->read()){
        if($f == '.' || $f == '..' || substr($f, 0, 1) == '.')continue;
        $lastmod = date('M j, Y, g:i a',filemtime($dir.$node.'/'.$f));
        if(is_dir($dir.$node.'/'.$f)){
            $qtip = 'Type: Folder<br />Last Modified: '.$lastmod;
            $nodes[] = array('text'=>$f, 'id'=>$node.'/'.$f/*, 'qtip'=>$qtip*/, 'cls'=>'folder');
        }else{
            $size = formatBytes(filesize($dir.$node.'/'.$f), 2);
            $qtip = 'Type: JavaScript File<br />Last Modified: '.$lastmod.'<br />Size: '.$size;
            $nodes[] = array('text'=>$f, 'id'=>$node.'/'.$f, 'leaf'=>true/*, 'qtip'=>$qtip, 'qtipTitle'=>$f */, 'cls'=>'file');
        }
    }
    $d->close();header("Content-Type: text/html; charset=utf-8");
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");function __jsonText($array)
    {
    $str = "{";
    foreach($array as $key=> $value)
    {
    $value = str_replace("\"", "\\\"", $value);
    if($str != "{") $str.=",";
    $str .= "$key: " . "\"$value\"";
    }
    $str .= "}";

    return $str;
    }
    $strNode = "";foreach($nodes as $key=>$value)
    {
    $strNode .= __jsonText($value) . ","; 
    }
    $strNode = sprintf('[%s]', iconv('gb2312', 'utf-8', rtrim($strNode, ',')));
    echo $strNode;搞定,结帖吧,呵呵.
      

  11.   

    大侠的意思是让我用这段代码代替get-nodes.php吧,但不知道怎么回事,替代过后,连英文目录都不显示了...
      

  12.   


    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Reorder TreePanel</title>
    <link rel="stylesheet" type="text/css" href="css-ext-all.css" />    <!-- GC -->
      <!-- LIBS -->
      <script type="text/javascript" src="ext-base.js"></script>
      <!-- ENDLIBS -->    <script type="text/javascript" src="ext-all.js"></script>
    <script type="text/javascript" src="reorder.js"></script><!-- Common Styles for the examples -->
    <link rel="stylesheet" type="text/css" href="examples.css" />
    </head>
    <body>
    <script type="text/javascript" src="examples.js"></script><!-- EXAMPLES -->
    <p>The js is not minified so it is readable. See <a href="reorder.js">reorder.js</a>.</p><div id="tree-div" style="overflow:auto; height:300px;width:250px;border:1px solid #c3daf9;"></div></body>
    </html>
    <?php
    // from php manual page
    function formatBytes($val, $digits = 3, $mode = "SI", $bB = "B"){ //$mode == "SI"|"IEC", $bB == "b"|"B"
       $si = array("", "K", "M", "G", "T", "P", "E", "Z", "Y");
       $iec = array("", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi");
       switch(strtoupper($mode)) {
           case "SI" : $factor = 1000; $symbols = $si; break;
           case "IEC" : $factor = 1024; $symbols = $iec; break;
           default : $factor = 1000; $symbols = $si; break;
       }
       switch($bB) {
           case "b" : $val *= 8; break;
           default : $bB = "B"; break;
       }
       for($i=0;$i<count($symbols)-1 && $val>=$factor;$i++)
           $val /= $factor;
       $p = strpos($val, ".");
       if($p !== false && $p > $digits) $val = round($val);
       elseif($p !== false) $val = round($val, $digits-$p);
       return round($val, $digits) . " " . $symbols[$i] . $bB;
    }$dir = isset($_REQUEST['lib'])&&$_REQUEST['lib'] == 'yui' ? '../../../' : '../../';
    $dir = "D:\\"; 
    $node = isset($_REQUEST['node'])?$_REQUEST['node']:"";
    if(strpos($node, '..') !== false){
        die('Nice try buddy.');
    }
    $node = iconv('utf-8', 'gb2312', $node);
    $nodes = array();
    $d = dir($dir.$node);
    while($f = $d->read()){
        if($f == '.' || $f == '..' || substr($f, 0, 1) == '.')continue;
        $lastmod = date('M j, Y, g:i a',filemtime($dir.$node.'/'.$f));
        if(is_dir($dir.$node.'/'.$f)){
            $qtip = 'Type: Folder<br />Last Modified: '.$lastmod;
            $nodes[] = array('text'=>$f, 'id'=>$node.'/'.$f/*, 'qtip'=>$qtip*/, 'cls'=>'folder');
        }else{
            $size = formatBytes(filesize($dir.$node.'/'.$f), 2);
            $qtip = 'Type: JavaScript File<br />Last Modified: '.$lastmod.'<br />Size: '.$size;
            $nodes[] = array('text'=>$f, 'id'=>$node.'/'.$f, 'leaf'=>true/*, 'qtip'=>$qtip, 'qtipTitle'=>$f */, 'cls'=>'file');
        }
    }
    $d->close();header("Content-Type: text/html; charset=utf-8");
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");function __jsonText($array)
    {
    $str = "{";
    foreach($array as $key=> $value)
    {
    $value = str_replace("\"", "\\\"", $value);
    if($str != "{") $str.=",";
    $str .= "$key: " . "\"$value\"";
    }
    $str .= "}";

    return $str;
    }
    $strNode = "";foreach($nodes as $key=>$value)
    {
    $strNode .= __jsonText($value) . ","; 
    }
    $strNode = sprintf('[%s]', iconv('gb2312', 'utf-8', rtrim($strNode, ',')));
    echo $strNode;
    /*
    $json = new Services_JSON(); 
    echo $json->encode($nodes); 
    */
    ?>
    本地测试成功,不知道你哪是啥情况.完全是下载你的包以后修改的.
      

  13.   

    各位大侠:我给$nodes新加了个值'checked'=>false,'checked'=>false$nodes[] = array('text'=>$f, 'id'=>$node.'/'.$f/*, 'qtip'=>$qtip*/, 'cls'=>'folder');
    为什么经过function __jsonText($array)
    {
        $str = "{";
        foreach($array as $key=> $value)
        {
            $value = str_replace("\"", "\\\"", $value);
            if($str != "{") $str.=",";
            $str .= "$key: " . "\"$value\"";
        }
        $str .= "}";
        
        return $str;
    }
    $strNode = "";foreach($nodes as $key=>$value)
    {
        $strNode .= __jsonText($value) . ","; 
    }
    $strNode = sprintf('[%s]', iconv('gb2312', 'utf-8', rtrim($strNode, ',')));
    echo $strNode;
    转换,值就变为空了呢?没查出原因,继续求教!
      

  14.   


    while($f = $d->read()){
        if($f == '.' || $f == '..' || substr($f, 0, 1) == '.')continue;
        $lastmod = date('M j, Y, g:i a',filemtime($dir.$node.'/'.$f));
        if(is_dir($dir.$node.'/'.$f)){
            $qtip = 'Type: Folder<br />Last Modified: '.$lastmod;
            $nodes[] = array('checked'=>false, 'text'=>$f, 'id'=>$node.'/'.$f/*, 'qtip'=>$qtip*/, 'cls'=>'folder');
        }else{
            $size = formatBytes(filesize($dir.$node.'/'.$f), 2);
            $qtip = 'Type: JavaScript File<br />Last Modified: '.$lastmod.'<br />Size: '.$size;
            $nodes[] = array('checked'=>false, 'text'=>$f, 'id'=>$node.'/'.$f, 'leaf'=>true/*, 'qtip'=>$qtip, 'qtipTitle'=>$f */, 'cls'=>'file');
        }
    }不知道你哪出了啥问题,我这块没有出现你所说的情况.
      

  15.   

    真的假的?可能是我没表达清楚,加上这个'checked'=>false, 并且在reorder.js中加点代码,就可以在树上出现checkbox了,我原先已经能加上checkbox了,但不能显示中文;用了您的代码后能显示中文了,但不能显示checkbox了!您也可以直接访问get_notes.php,checked值因该是空的... 
    http://www.myext.cn/Article/839.html,公司不能截图,所以表达的困难...
      

  16.   

    前阵用ext做个无限极的目录,把输出变量改成UTF-8的就可以显示中文了。加个新值也能使。估计楼主哪马虎了吧
      

  17.   

    在哪里该啊,能说的详细点吗?我们都想知道,如果那么方便的话,就省自己写JSON(总觉得网上提供的JSON对中文支持的不够好...),你说的我信,但实在不知道,哪里马虎了,我认为自己写程序时没注意编码(我是指文字的实际编码),你们用了什么转码工具吗?
      

  18.   

    其实中文的你用他本身的那个JSON也可以,但是就是需要修改了!这里就不说那个改的了,你要改的话你可以自己根据我现在给的这个思路去改!!<?php
    // from php manual page
    function formatBytes($val, $digits = 3, $mode = "SI", $bB = "B"){ //$mode == "SI"|"IEC", $bB == "b"|"B"
       $si = array("", "K", "M", "G", "T", "P", "E", "Z", "Y");
       $iec = array("", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi");
       switch(strtoupper($mode)) {
           case "SI" : $factor = 1000; $symbols = $si; break;
           case "IEC" : $factor = 1024; $symbols = $iec; break;
           default : $factor = 1000; $symbols = $si; break;
       }
       switch($bB) {
           case "b" : $val *= 8; break;
           default : $bB = "B"; break;
       }
       for($i=0;$i<count($symbols)-1 && $val>=$factor;$i++)
           $val /= $factor;
       $p = strpos($val, ".");
       if($p !== false && $p > $digits) $val = round($val);
       elseif($p !== false) $val = round($val, $digits-$p);
       return round($val, $digits) . " " . $symbols[$i] . $bB;
    }$dir = isset($_REQUEST['lib'])&&$_REQUEST['lib'] == 'yui' ? '../../../' : '../../';
    $dir = "D:\\"; 
    $node = isset($_REQUEST['node'])?$_REQUEST['node']:"";
    if(strpos($node, '..') !== false){
        die('Nice try buddy.');
    }
    $node = iconv('utf-8', 'gb2312', $node);
    $nodes = array();
    $d = dir($dir.$node);
    $flag=false;
    while($f = $d->read()){
        if($f == '.' || $f == '..' || substr($f, 0, 1) == '.')continue;
        $lastmod = date('M j, Y, g:i a',filemtime($dir.$node.'/'.$f));
        if(is_dir($dir.$node.'/'.$f)){
            $qtip = 'Type: Folder<br />Last Modified: '.$lastmod;
            $nodes[] = array('checked'=>$flag,'text'=>$f, 'id'=>$node.'/'.$f/*, 'qtip'=>$qtip*/, 'cls'=>'folder');
        }else{
            $size = formatBytes(filesize($dir.$node.'/'.$f), 2);
            $qtip = 'Type: JavaScript File<br />Last Modified: '.$lastmod.'<br />Size: '.$size;
            $nodes[] = array('checked'=>$flag,'text'=>$f, 'id'=>$node.'/'.$f, 'leaf'=>true/*, 'qtip'=>$qtip, 'qtipTitle'=>$f */, 'cls'=>'file');
        }
    }
    $d->close();header("Content-Type: text/html; charset=utf-8");
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");function jsonText($array)
    {
        $str = "{";
        foreach($array as $key=> $value)
        { if($str != "{") $str.=",";  
    switch (gettype($value)) {
                case 'boolean':
    $value=$value ? 'true' : 'false';
    $str .= "$key: " .$value;
    break;
    default: 
    $value = str_replace("\"", "\\\"", $value);
    $str .= "$key: " ."\"$value\""; 
    break; 
    }
             
        }
        $str .= "}";
        
        return $str;
    }
    $strNode = "";foreach($nodes as $key=>$value)
    {
        $strNode .= jsonText($value) . ","; 
    }
    $strNode = sprintf('[%s]', iconv('gb2312', 'utf-8', rtrim($strNode, ',')));
    echo $strNode;
    ?>
    switch (gettype($value)) {
                case 'boolean':
    $value=$value ? 'true' : 'false';
    $str .= "$key: " .$value;
    break;
    default: 
    $value = str_replace("\"", "\\\"", $value);
    $str .= "$key: " ."\"$value\""; 
    break; 
    }这部分才是关键代码
      

  19.   

    你给的JSON.php这个里面有与在 case 'string'的时候转了编码转换,所以返回的中文数据格式是\u0384这样的,导致中文乱码,只要把那部分去掉即可算了,给出来给你吧,就是改下面的代码:
     case 'string':
                    // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
                   /* $ascii = '';
                    $strlen_var = strlen($var);               /*
                    * Iterate over every character in the string,
                    * escaping with a slash or encoding to UTF-8 where necessary
                    
                    for ($c = 0; $c < $strlen_var; ++$c) {                    $ord_var_c = ord($var{$c});                    switch (true) {
                            case $ord_var_c == 0x08:
                                $ascii .= '\b';
                                break;
                            case $ord_var_c == 0x09:
                                $ascii .= '\t';
                                break;
                            case $ord_var_c == 0x0A:
                                $ascii .= '\n';
                                break;
                            case $ord_var_c == 0x0C:
                                $ascii .= '\f';
                                break;
                            case $ord_var_c == 0x0D:
                                $ascii .= '\r';
                                break;                        case $ord_var_c == 0x22:
                            case $ord_var_c == 0x2F:
                            case $ord_var_c == 0x5C:
                                // double quote, slash, slosh
                                $ascii .= '\\'.$var{$c};
                                break;                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
                                // characters U-00000000 - U-0000007F (same as ASCII)
                                $ascii .= $var{$c};
                                break;                        case (($ord_var_c & 0xE0) == 0xC0):
                                // characters U-00000080 - U-000007FF, mask 110XXXXX
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
                                $c += 1;
                                $utf16 = $this->utf82utf16($char);
                                $ascii .= sprintf('\u%04s', bin2hex($utf16));
                                break;                        case (($ord_var_c & 0xF0) == 0xE0):
                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $char = pack('C*', $ord_var_c,
                                             ord($var{$c + 1}),
                                             ord($var{$c + 2}));
                                $c += 2;
                                $utf16 = $this->utf82utf16($char);
                                $ascii .= sprintf('\u%04s', bin2hex($utf16));
                                break;                        case (($ord_var_c & 0xF8) == 0xF0):
                                // characters U-00010000 - U-001FFFFF, mask 11110XXX
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $char = pack('C*', $ord_var_c,
                                             ord($var{$c + 1}),
                                             ord($var{$c + 2}),
                                             ord($var{$c + 3}));
                                $c += 3;
                                $utf16 = $this->utf82utf16($char);
                                $ascii .= sprintf('\u%04s', bin2hex($utf16));
                                break;                        case (($ord_var_c & 0xFC) == 0xF8):
                                // characters U-00200000 - U-03FFFFFF, mask 111110XX
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $char = pack('C*', $ord_var_c,
                                             ord($var{$c + 1}),
                                             ord($var{$c + 2}),
                                             ord($var{$c + 3}),
                                             ord($var{$c + 4}));
                                $c += 4;
                                $utf16 = $this->utf82utf16($char);
                                $ascii .= sprintf('\u%04s', bin2hex($utf16));
                                break;                        case (($ord_var_c & 0xFE) == 0xFC):
                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X
                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
                                $char = pack('C*', $ord_var_c,
                                             ord($var{$c + 1}),
                                             ord($var{$c + 2}),
                                             ord($var{$c + 3}),
                                             ord($var{$c + 4}),
                                             ord($var{$c + 5}));
                                $c += 5;
                                $utf16 = $this->utf82utf16($char);
                                $ascii .= sprintf('\u%04s', bin2hex($utf16));
                                break;
                        }
                    }
    */
                    return "\"$var\"";然后在get-nodes.php中:

    echo $json->encode($nodes); 
    改为
    $json =iconv('gb2312', 'utf-8', $json->encode($nodes));
    echo $json呵呵就这么简单
      

  20.   

    真的很感谢大家!帮我完成了我现在根本完成不了的任务(我刚接触php),希望以后大家能继续支持我,共同学习,共同进步!资源已整理:http://download.csdn.net/source/784541