file_exists對於英文檔名行為正常,但對於中文檔名雖然不會出錯但行為異常
網路上查到的大多是需要進行轉碼動作,但還是無法動作,
想詢問各位前輩們要怎麼解決中文問題或有沒有其他的替代方式???
環境: php 5.6 / win10
編碼:檔案UTF-8 / 作業系統Big5
測試代碼
$tmp1 = 'C:\\VisualHosts\\storage\\539\\餐飲技術.jpg';
//$tmp1 = 'C:\\VisualHosts\\storage\\539\\AAA-_.jpg';
$tmp2 = file_exists($tmp1);
$tmp3 = exif_imagetype($tmp1);
$tmp4 = mb_convert_encoding($tmp1, 'big5');
$tmp5 = file_exists($tmp4);
$tmp6 = exif_imagetype($tmp4);
$tmp7 = iconv('utf-8', 'big5', $tmp1);
$tmp8 = file_exists($tmp7);
$tmp9 = exif_imagetype($tmp7);
$tmp10 = mb_convert_encoding($tmp1, 'cp1252');
$tmp11 = file_exists($tmp10);
$tmp12 = exif_imagetype($tmp10);
$tmp13 = iconv('utf-8', 'cp1252', $tmp1);
$tmp14 = file_exists($tmp13);
$tmp15 = exif_imagetype($tmp13);
目前測出來的結果
變數|餐飲技術.jpg|AAA-_.jpg
---|---
$tmp2|false|true
$tmp3|false|2
$tmp4|"C:\VisualHosts\storage\539\�\���N.jpg"
|"C:\VisualHosts\storage\539\AAA-_.jpg"
$tmp5|false|true
$tmp6|false|2
$tmp7|"C:\VisualHosts\storage\539\�\���N.jpg"
|"C:\VisualHosts\storage\539\AAA-_.jpg"
$tmp8|false|true
$tmp9|false|2
$tmp10|"C:\VisualHosts\storage\539\????.jpg"
|"C:\VisualHosts\storage\539\AAA-_.jpg"
$tmp11|false|true
$tmp12|false|2
$tmp13|false|"C:\VisualHosts\storage\539\AAA-_.jpg"
$tmp14|false|true
$tmp15|false|2
$tmp4 = mb_convert_encoding($tmp1, 'UTF-8');
建議編寫資料庫
將原始檔名另外存起來
然後不管是比對檔案是否重複
還是下載在組合原始檔名都可以
也能避免檔案覆蓋跟中文異常
我覺得問題不在 file_exists 這個函數上耶,
因為我的壞習慣是,很常使用中文檔名,當然也很常使用 file_exists
沒出過問題啊,算我運氣好。
或許是 Linux+php 的關係吧,兩者環境相同,都是 utf8。
印象中,
網頁上的檔案,
本來就是要避免使用中文,
中文通常是存資料庫另外作說明,
也就是說明是中文,
但是檔名是英文(或是隨機字串).
我存在 Google 雲端硬碟上的檔案,也都使用中文檔名,也沒出過問題。
我是想,【顧名思義】很重要,如果一個檔名沒辦法望文生義,那麼久而久之,肯定不知所云。
早年的作業系統,中文檔名常會出槌,使得大家不太敢用,如今應該無此顧忌才對,除非您的檔案是要給外國人。
照小魚說的方式,使用者並不會知道實際上是用中文還是英文存的。
並不會有「沒辦法望文生義」的問題。
查了一下php7的change log:
https://www.php.net/ChangeLog-7.php
php-7.1.0修了一個bug:
Fixed UTF-8 and long path support on Windows.
這之後的版本就沒問題。7.0.33(應該是7.0最後一版?)還是會有問題。
基本上如果可以從上傳下手,就會從上傳中下手讓實際檔名不是中文。
不過比較常遇到的是提供ftp上傳。
或是直接網芳上傳。這些都容易碰到中文檔名的問題沒錯。
我早期曾經的做法給你參考。
當獲取的檔名中,有發現非英數及一些符號時。
會先用正則檢查是否為中文。
不是中文的話,會試著用big5、gb2312、iso這些編碼轉換一次試試。
直到用正則能判斷為中文為止。