在上傳文件后,一般都會用 move_uploaded_file() 進行文件移動改名。但是 move_uploaded_file() 並不支持 UTF-8 編碼,如果含有,那么函數就會執行失敗,但是這個函數是支持 GB2312 或者是 GBK 編碼的,因此可以利用 iconv() 函數先進行名字轉換來來解決問題。有兩種情況:
1. 服務器是中文 Windows 環境
在服務器是中文 Windows 環境下,由於中文 Windows 系統的編碼是 GB2312,那么可以如下使用代碼:
上面代碼的意思是,先用 iconv() 函數對上傳文件名轉換為 GB2312 碼(上傳的文件名若含有中文,那么使用 UTF-8 編碼),然后再進行 move_uploaded_file() 改名。這樣在中文系統下就可以正常顯示了。但是 Linux 系統本身就是使用 UTF-8 來編碼的,因此想要在 Linux 下正常顯示中文,那么就再次 iconv() 轉換一下,這是下面所說的第 2 種情況。
2. 服務器是 Linux 系統
如上面所講,利用 move_uploaded_file() 函數支持 GBK 的特性,那么我們可以利用再次轉換的小技巧使上傳的文件名中含有中文的文件在 Linux 下也能正常顯示中文名稱,如下面代碼所示:
<?php $upload_file = iconv("UTF-8", "GBK", $_FILES["myfile"]["name"]); //先轉換名字為 GBK 編碼 if (move_uploaded_file($_FILES["myfile"]["tmp_name"], $upload_file)) { $res_file = iconv("GBK", "UTF-8", $upload_file); // 再從 GBK 轉為 UTF-8 rename($upload_file, $res_file); // 重命名一下文件 echo "<strong>upload ok</strong><hr>"; } else { echo "upload failed"; } ?>
運行輸出:
<1> 上傳一個文件名中含有中文的文件:
<2> 檢查在 Linux 下是否正常顯示:
正常。
解決 move_uploaded_file() 中文亂碼問題
http://www.groad.net/bbs/thread-7179-1-1.html
(出處: 曲徑通幽論壇)