2008年2月26日 星期二

PHP 上傳中文檔案 BIG5

看到BIG5就應該知道會遇上許功蓋
目前手上進行的專案需要在BIG5的環境中上傳中文命名的檔案
並且將原始的中文檔名存入資料庫
這個問題最好的解決方式仍是將系統轉為UTF-8
但不適合現在的專案,再來想到的處理方式是
把該相關的處理程式轉成UTF-8,要存進資料庫時再將UTF-8轉成BIG5
不過,這只適合處理程式邏輯不多的狀況,
現行的相關處理程式邏輯很多
接著又想到一個搭配Javascript的處理方式
先在表單中增加一個Hidden欄位存放上傳的中文檔名
將Submit時,取出使用者上傳的檔名經由escape編碼後寫到Hidden欄位中
語法如下
//Javascript For Windows

function setFilesName(s, ss) { < br / >
    //s = 上傳欄位id, ss = hidden欄位id

    var aryFiles = document.getElementById(s).value.split('\\'); < br / >
    var strFileFullName = aryFiles[aryFiles.length - 1]; < br / >
        document.getElementById(ss).value = escape(strFileFullName.substr(0, strFileFullName.lastIndexOf('.'))); < br / >
}
然後在處理的程式使用unescape回復原始檔名
//PHP unescape
function unescape($arg_strEscapeContent, $arg_strCharset = 'big5') {
    return mb_convert_encoding(preg_replace_callback("/%u?\w{2,4}/", "uni_2_utf8", $arg_strEscapeContent), $arg_strCharset, 'utf-8');
}

function uni_2_utf8($arg_aryWords) {
    $strWord = str_replace(array('%', 'u'), '', $arg_aryWords[0]);
    $intHex2Dec = intval($strWord, 16);
    if (isset($strWord[2])) {
        if ($intHex2Dec <= 0x7F) {
            return chr($intHex2Dec);
        } else if ($intHex2Dec <= 0x7FF) {
            return chr(0xC0 $intHex2Dec >> 6).chr(0x80 $intHex2Dec & 0x3F);
        } else if ($intHex2Dec <= 0xFFFF) {
            return chr(0xE0 $intHex2Dec >> 12).chr(0x80 $intHex2Dec >> 6 & 0x3F).chr(0x80 $intHex2Dec & 0x3F);
        } else if ($intHex2Dec <= 0x10FFFF) {
            return chr(0xF0 $intHex2Dec >> 18).chr(0x80 $intHex2Dec >> 12 & 0x3F).chr(0x80 $intHex2Dec >> 6 & 0x3F).chr(0x80 $intHex2Dec & 0x3F);
        }
    } else {
        return chr($intHex2Dec);
    }
}

沒有留言: