1 回答

TA貢獻1712條經驗 獲得超3個贊
今天在開發的時候需要將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的格式,同時我的代碼本身也是utf-8的格式,雖然我最后通過格式轉換,成功把gbk的字符串轉換成utf-8導出,但是在轉換的過程中可能會出現問題(當時想的是這樣,不過之后考慮了一下,因為之前在gbk格式下使用var_export已經出現了問題,因此應該不是轉換過程中的問題,應該是var_export處理gbk格式的漢字字符串時產生的bug?),于是我將csv文件全部轉換成utf-8格式,重新導入文件,成功解決。
其實在解決的過程中,很早就想到可能是編碼的問題,但是一直沒有發現excel轉換的csv文件的格式問題,因為之前導出的配置文件沒有漢字,因此沒有出現過這一類的問題,于是就忽略了,不過最后雖然解決了問題,但是問題本身的原因還是不明,推測極有可能是因為gbk編碼和var_export的兼容導致的問題,果然開發中應該還是盡量使用utf-8統一編碼,應該會減少很多不明的錯誤。
2013.1.19更新:經過思考,覺得應該是對于gbk編碼的字符串使用var_export時,函數對于單個字符表示為反斜杠的字符添加了反斜杠的轉義,因此使得該處的字符變為兩個反斜杠,同時因為在顯示時使用了gbk編碼,導致添加的反斜杠作為前一個漢字字符的一部分被顯示,而原來的反斜杠字符則單獨顯示了出來。
- 1 回答
- 0 關注
- 824 瀏覽
添加回答
舉報