目前手上進行的專案需要在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); } }
沒有留言:
張貼留言