作者CheLiu (劉徹)
看板PHP
標題[請益] 匯入CSV問題
時間Tue Apr 21 10:47:19 2015
這幾天遇到了一個怪怪的問題
問題敘述如下
1、有兩台機器 本機及正式系統機器
2、原本可以順利上傳匯入資料 不會亂碼
印象中沒有改到相關上傳的code卻突然變成
上傳之後會亂碼
3、之後本機再測試可以正常上傳不會亂碼後
就整個網頁再覆蓋到系統機器卻依然亂碼
懷疑是資料庫有設定改變?但卻又找不到
有跟本機比對過 都一樣
不曉得還有可能是哪邊有問題呢?謝謝
補充: 有把系統機器的資料庫備份轉移到本機
再次測試依然可以正確上傳無亂碼
所以有可能是機器本身哪邊設定嗎?
更新問題:
經過大家的提示或教導後有發現一個不同點
就是
1.在本機讀取檔案內容echo 出來是亂碼,編碼確定是UTF8
但是可以正確寫入資料庫
2.在SERVER端讀取同一份檔案echo出來
編碼測試也確定是UTF8
但是ECHO出來 卻會變成空白 或是不同字元 總之就是跟本機echo出來的
完全不一樣,當然也還是無法些寫入資料庫
問題解決&結論
首先感謝rockmanalpha版友花時間協助及幫忙,不然我應該很難找出問題
這個問題經過一些測試rockmanalpha發現可能是
5.2好像有一個BUG 會將分隔後的資料中第一個高位字元拿掉
所以會造成中文有亂碼,但卻又不是每個系統都會發生
或是fgetcsv 有什麼隱藏參數 這部分小弟會找時間再測試看看
最後解決方式是在CSV檔案裡面的每個欄位都加上雙引號
ex: "姓名","生日"
就這樣我手上兩個系統都沒有做任何設定更動或程式碼變動
問題就解決了
感謝rockmanalpha及眾位板友,也回饋給大家這個問題 謝謝大家
※ 編輯: CheLiu (122.147.100.151), 04/21/2015 11:03:25
1F:推 hareion08: 在資料庫連接加上"set names utf8" or 讀取CSV字串加上 04/21 11:12
2F:→ hareion08: iconv()強制轉換編碼 or 你資料庫編碼不正確 04/21 11:12
3F:→ CheLiu: set names那個有加 而且有把原本不行的資料庫備份到本機 04/21 11:30
4F:→ CheLiu: 進行測試 結果又是可以 04/21 11:31
5F:推 rockmanalpha: Live Server DB的Collation是不是utf8? 04/21 12:02
6F:推 rockmanalpha: 還有你的CSV檔有沒有BOM? 04/21 12:05
7F:推 rockmanalpha: 還有你可以試著在正式機器上將資料寫入DB前 先輸出 04/21 12:07
8F:→ rockmanalpha: 看看這時的UTF8是不是亂碼 是亂碼就排除掉DB出問題 04/21 12:08
9F:→ rockmanalpha: 的可能性 04/21 12:08
10F:→ CheLiu: 先輸出就已經是亂碼了 所以看起來不是資料庫問題 04/21 12:25
11F:→ CheLiu: BOM的話應該也沒問題 同一份檔案本機可以 也有試過用記事 04/21 12:26
12F:→ CheLiu: 本去除BOM 結果也是一樣 04/21 12:26
13F:推 rockmanalpha: 想確認下上傳的檔案編碼是不是UTF8? 另外輸出的PHP 04/21 13:42
14F:→ rockmanalpha: 頁面也要加UTF8的header 開網頁看是否還是亂碼 04/21 13:43
15F:推 sunnyvisit: 可能本來utf8正常但其他編碼就會有問題? 04/21 14:12
16F:→ CheLiu: 上傳和輸出的頁面編碼都是utf8 04/21 14:38
17F:推 rockmanalpha: 如果你本地跟正式Server一個是Windows一個是Linux 04/23 14:24
18F:→ rockmanalpha: 的話 我懷疑是語系問題 試試看在程式開頭加上這句 04/23 14:25
19F:→ rockmanalpha: setlocale(LC_ALL,'zh_TW.UTF-8') 或者是zh_TW 04/23 14:26
20F:→ rockmanalpha: 總之是正式機器系統中的語系代號 測試看看 04/23 14:27
※ 編輯: CheLiu (122.147.100.151), 04/23/2015 15:36:51
※ 編輯: CheLiu (122.147.100.151), 04/23/2015 18:40:50
21F:推 rockmanalpha: 我想就是fgetcsv本身的問題了 網上也有人重寫了這個 04/23 19:00
22F:→ rockmanalpha: function 不過最簡單方法就是用5.2以上的PHP版本就 04/23 19:01
23F:→ rockmanalpha: 應該沒這個問題了 04/23 19:01