中文的問題

edited 十月 2013 in PHP新手區
我用PHP寫了個瀏覽目錄程式,其中每個檔案是以
<a href="檔案url">檔名</a>
的方式藉由browser去瀏覽它...

若檔案名稱有中文字時就無法瀏覽,是不是因為URL沒有中文支援呢?
若如此,還可以用什麼方式來瀏覽檔案呢?

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=40

評論

  • edited 五月 2004
    改成這樣試試:

    <a href="url<?=rawurlencode("中文檔名");?>">中文檔名</a>

    自己並沒有試過,不過有看過類似的處理方式;也有人透過HEADER函數直接指定檔案名稱,好處是下載者不容易得知實際檔案存放的位置。可以參考XOSC模組中的下載程式/shop/download.php
  • edited 五月 2004
    感謝kiang的指點,有關您提到的"透過HEADER函數直接指定檔案名稱"可以麻煩您舉個簡單的例子嗎 ?

    還有就是執行copy()時,若路徑中有中文字元時,copy()似乎不能執行.要怎麼解決這問題呢 ?
  • edited 五月 2004
    我並沒有實際去處理過這個問題,我都是直接規定使用者必須使用英文檔案與資料夾名稱,下面是OSC中透過HEADER函式處理檔案下載的範例:
    // Now send the file with header() magic
      header("Expires: Mon, 26 Nov 1962 00:00:00 GMT");
      header("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
      header("Cache-Control: no-cache, must-revalidate");
      header("Pragma: no-cache");
      header("Content-Type: Application/octet-stream");
      header("Content-disposition: attachment; filename=" . $downloads['orders_products_filename']);
    
      if (DOWNLOAD_BY_REDIRECT == 'true') {
    // This will work only on Unix/Linux hosts
        tep_unlink_temp_dir(DIR_FS_DOWNLOAD_PUBLIC);
        $tempdir = tep_random_name();
        umask(0000);
        mkdir(DIR_FS_DOWNLOAD_PUBLIC . $tempdir, 0777);
        symlink(DIR_FS_DOWNLOAD . $downloads['orders_products_filename'], DIR_FS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']);
        tep_redirect(DIR_WS_DOWNLOAD_PUBLIC . $tempdir . '/' . $downloads['orders_products_filename']);
      } else {
    // This will work on all systems, but will need considerable resources
    // We could also loop with fread($fp, 4096) to save memory
        readfile(DIR_FS_DOWNLOAD . $downloads['orders_products_filename']);
      }
    
  • edited 五月 2004
    原來真的是IE的utf-8選項的關係.

    我有個想法不知對不對,在我將引許utf-8的URL選項勾起來後,之所以無法瀏覽中文路徑檔案是因網址已引許中文字元了,因而網址列的請求就直接送往Apache,或許是apache無法接受這樣的請求(看不懂所請求的檔案相關路徑).

    而取消utf-8 url選項後,瀏覽器會自動在送出請求前先對含有非西歐語系字元的URL進行編碼,因此Apache就沒有看不懂請求的問題,也就能正常瀏覽含中文字元路徑的檔案了.

    所以若要享有中文字元URL的功能(也就是啟動IE的UTF-8 url),還得視Apache能不能處理這樣的請求.若如此,那麼apache又該做些什麼設定呢?...否則一切不是白搭.

    不知我這樣想對不對啦...希望了解原由的人能不吝指點一下(畢竟已耗了滿長的時間在這件事,沒弄懂實在很可惜)...

  • edited 六月 2004
    應該說,IE會將使用者輸入的網址轉換成UTF-8格式送出,而APACHE可能是以ASCII為基礎,所以類似的問題並沒有發生在IIS上,嗯...聰明的微軟

    相關的方式可以在網路上找到,我猜有兩個方向可以嘗試:
    1. 重新編譯APACHE,讓它支援網址傳來的UTF-8編碼文字
    2. 透過PHP作為檔案系統與使用者之間的橋樑

    前者沒有經驗,後者意思就是先處理使用者輸入的網址,如果是UTF-8就轉成系統可以辨識的文字,然後透過HEADER函數將資料透過PHP傳給使用者。沒有實作過,有機會再試試,我還是喜歡跟使用者約法三章 :-D
  • edited 六月 2004
    不好意思,我只簡單用了如下般的copy()函式來處理檔案的複製,
    $handle_goal = opendir($directory_path_goal);

    while ( $file_name_goal = readdir($handle_goal) ) {

    $copyfile_total += ( copy( $value , $directory_path_goal.$file_name ) ) ? 1 : 0;

    }


    為什麼有時候會無法執行並出現如下的訊息呢 ?(我是用winxp來測試的,怎麼會有所謂的權限問題呢)

    Forbidden
    You don't have permission to access /test/php/files manager/< on this server.

    Apache/1.3.28 Server at 204.203.136.214:80 Port 80

  • edited 六月 2004
    ...你的程式碼沒頭沒尾的,如果擔心人家知道就不要問了吧 :-(
    $copyfile_total += ( copy( $value , $directory_path_goal.$file_name ) ) ? 1 : 0;
    

    改成下面這樣就不會有錯誤訊息了:
    if($file_name_goal!="."&&$file_name_goal!="."){
      $copyfile_total += ( copy( $value , $directory_path_goal.$file_name ) ) ? 1 : 0;
    }
    
  • edited 六月 2004
    抱歉,kiang兄,我沒有別的意思.
    由於之前發問(其它的forum)有個經驗就是開版就貼程式碼通常都會乏人問津...

    感謝你的指點,我已找到問題癥結.
    還是老問題,通常這情況都發生在url含中文字元時,
    我試了很多組合,只要將發生問題的路徑的中文換成英文或相異的中文字元就又ok了...

    在我將IE的utf-8取消後,我還是有利用rawurlencode()將網址給編碼再送出,只是好像並非萬全丹,有的中文字元即使已被編碼過apache還是看不懂....

    有replyer叫我不要那麼龜毛,只是感覺上既然是file manager的程式,作一個完全避開中文命名的好像怪怪的...
    差點忘了問你那個if判斷式的用意是什麼?
    '.'與'..'是指相對路徑嗎?
  • edited 六月 2004
    你可能沒有翻閱PHP線上手冊的習慣吧:

    http://tw.php.net/docs.php

    '.'與'..'會存在每一個資料夾中,有點類似連結,一個指的是所在目錄,一個是上一層目錄,我也不知道為什麼會存在,我只知道處理時必須跳過這兩個,有興趣可以去研究readdir()的原始碼。

    最快的方式是使用IIS+PHP,我沒有這麼深入中文字碼的研究,或許可以去看看歐萊禮的那本"中日韓越資訊處理":

    http://www.oreilly.com.tw/chinese/other/cjkv.html
  • edited 六月 2004
    哇!...$1980,..這本...至少可抵個兩本O'REILLY系列.嗯,或許真的很不錯畢竟一分錢一分貨,感謝KIANG提供的資訊.


    抱歉,這是最後一問了,關於urlencode()與rawurlencode()有何不同?我只知道"空白字元"的編碼一為"+"一則為"%20",
    但更重要的是在哪些情況要用哪一個 ?





  • edited 六月 2004
    差別也只有你所提到的部份,urlencode()適合用來透過網址傳遞查詢的字串,rawurlencode()適合用來辨識包括資料夾中的空白字元;如果你要做線上檔案管理,基本上都是使用後者吧。
  • edited 六月 2004
    Thanks a lot ! Kiang兄.
Sign In or Register to comment.