如果 opencart 架在Windows上面,把中文檔名的圖片丟到網頁資料夾,然後在後台要設定產品圖片,或是在文章管理那邊使用文字編輯器 (CKEditor)選擇圖片,會發現圖片通通都不見了。
這是編碼問題。丟到網頁資料夾裡面的檔案名稱,應該是 big5 編碼。Windows至今還是不把 utf8(unicode) 設為預設值。但是 CKEditor 好像不支援 big5。
網路上找了一會兒還沒看到解法。突然想起來之前使用 PHPExcel 也發生過類似的問題( PHPExcel - 中文檔名與路徑的問題 ) ~~ 我怎麼想那麼久。不過網路上怎麼沒什麼人講。大概是我關鍵字下的不好?這兩個問題不完全一樣,不過都是檔名的編碼問題。(是檔名,不是檔案的內容)
PHPExcel 那邊的問題是,要把報價單存成 excel ,並以客戶名稱做為檔名。但是資料庫使用 UTF-8 編碼,使用者瀏覽網頁是沒問題,但是要把匯出來的檔案以客戶名稱命名,檔名就有可能出現亂碼。這是因為在成中文檔名的時候,Windows 會使用 Big5 碼儲存(或者說是 ASCII ?) 這時候決定採用哪種編碼的是 Windows,而不是瀏覽器。所以就算把瀏覽器的編碼改成 UTF-8 也沒用。解法是把檔名變數使用iconf, utf8轉成big5,然後Windows就可以使用這個big5的字串去給檔案命名。
Opencart 這邊流程上顛倒。圖片的中文檔名是 Big5。但是網頁是 UTF-8,所以網頁要去讀圖片時,不認得那些big5的檔名。這時候就算把瀏覽器改成 Big5 也沒用,更糟。因為 Opencart 是 UTF-8,如果把瀏覽器改成 Big5,就不只是 CKEditor看不到圖片,整個頁面都是亂碼。圖片(Big5) => Opencart(UTF-8) => 瀏覽器(Big5) 。
解決方式:
瀏覽器不要動,維持自動偵測。 Opencart 會告訴瀏覽器用 UTF-8。在 html 的 head 裡面有這一行 <meta charset="UTF-8" /> 。
Opencart 在儲存的時候,把 UTF-8 的檔名,透過 php 的 iconv 函數,轉成 Big5 。如下。
opencart 版本:v1.5.6.1
檔案
/admin/controller/common/filemanager.php
找到這一段
$json[] = array(
'filename' => basename($file),
'file' => utf8_substr($file, utf8_strlen(DIR_IMAGE . 'data/')),
'size' => round(utf8_substr($size, 0, utf8_strpos($size, '.') + 4), 2) . $suffix[$i]
);
在它前面插入一段:
//判斷是否是 Windows。如果是,把 big5 檔名轉成utf8檔名。
$agent = $_SERVER['HTTP_USER_AGENT'];
if(preg_match("/Windows/",$agent)){
$filename = iconv('Big5','UTF-8',basename($file));
}else{
$filename = basename($file);
}
$json[] = array(
'filename' => $filename ,
'file' => utf8_substr($file, utf8_strlen(DIR_IMAGE . 'data/')),
'size' => round(utf8_substr($size, 0, utf8_strpos($size, '.') + 4), 2) . $suffix[$i]
);
這個問題其實可以避免。這個問題會發生是因為現在這個站台是架在自己電腦上測試,而我的作業系統是 Windows。將來正式的站台如果放到 Linux 上面,統一採用 utf8 編碼,應該不會有這個問題。
沒有留言:
張貼留言