今天在開發的時候需要將excel檔案中資料匯入到相關的設定檔中,我按照過去經常使用的方法,先將excel匯出成csv檔案,然後使用fgetcsv函數讀取檔案的內容,通過Yii架構中的CConfigure類匯出成設定檔,然後在檢查的時候發現匯出的數組中有些值中間有一些多餘的反斜線,這些反斜線一般出現在繁體中文或者日文的文字中。 一開始我先檢查了csv和excel檔案中的欄位,發現並沒有什麼問題,之後我查看了CConfigure類中的saveAsString函數,發現他使用了php中的var_export函數來實現匯入設定檔的功能,然後,我又使用var_export輸出會出現問題的某個欄位,發現確實在字串中添加了反斜線,而我直接使用echo或者var_dump輸出時,則沒有這個情況發生,這個時候我明白問題是出在var_export這個函數上。 在查閱了相關的資料後我發現var_export這個函數會自動轉義,也許是這個原因導致了字串中自動添加了反斜線,可是字串本身並沒有特殊字元,為什麼var_export還是會添加反斜線,這個讓我百思不得其解,我查看了出現問題的字串的2進位編碼,發現出現反斜線的地方本身的單個字元的ascii碼也是反斜線,也就是說可能是var_export在轉義時針對單個反斜線字元進行了轉義?這個原因我最後也沒有搞明白。 不過在我不知道如何解決這個問題的時候,我突然想到我的csv的文字編碼是gbk的,因為是通過excel直接轉的格式,然後我匯出的檔案編碼是utf-8的格式,同時My Code本身也是utf-8的格式,雖然我最後通過格式轉換,成功把gbk的字串轉換成utf-8匯出,但是在轉換的過程中可能會出現問題(當時想的是這樣,不過之後考慮了一下,因為之前在gbk格式下使用var_export已經出現了問題,因此應該不是轉換過程中的問題,應該是var_export處理gbk格式的漢字字串時產生的bug?),於是我將csv檔案全部轉換成utf-8格式,重新匯入檔案,成功解決。www.2cto.com 其實在解決的過程中,很早就想到可能是編碼的問題,但是一直沒有發現excel轉換的csv檔案的格式問題,因為之前置出的設定檔沒有漢字,因此沒有出現過這一類的問題,於是就忽略了,不過最後雖然解決了問題,但是問題本身的原因還是不明,推測極有可能是因為gbk編碼和var_export的相容導致的問題,果然開發中應該還是盡量使用utf-8統一編碼,應該會減少很多不明的錯誤。
http://www.bkjia.com/PHPjc/477805.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/477805.htmlTechArticle今天在開發的時候需要將excel檔案中資料匯入到相關的設定檔中,我按照過去經常使用的方法,先將excel匯出成csv檔案,然後使用fgetcsv函數...