2011-11-13 37 views
2

我從一個來自excel的CSV文件導入數據,但我似乎無法正確插入我的數據。此數據包含法語重音字符,如果我用OpenOffice打開CSV(我不使用Excel),我只需選擇UTF-8,數據就會轉換並顯示正常。Mysql插入被怪異字符編碼截斷的文本數據

如果我嘗試讀取到php內存中,我可以看到他們是UTF-8編碼的字符串,如果我使用MB_DETECT_ENCODING。我連接到數據庫,並使用指定所有UTF-8字符集:

mysql_query('SET character_set_results = "utf8", character_set_client = "utf8", character_set_connection = "utf8", character_set_database = "utf8", character_set_server = "utf8"'); 

,我可以證明,我的數據庫包含UTF-8隻字段和表。

會發生什麼情況是我的內容在第一個重音字符處被截斷。但是,這似乎只發生在我的PHP腳本中。我輸出所有的數據到瀏覽器,如果我複製INSERT語句,它會插入整個數據。

在php和瀏覽器輸出之間可能會發生一些事情,但我可以證明它不在腳本編程中......到目前爲止,我能夠通過HTMLENTITY'ing我所有的數據來繞過這個問題,但問題是,我的搜索引擎會首席運營官COO-瘋狂,因爲那......

任何理由,你能抽出將非常感激的方式...

編輯#1:

我搜索了CSV數據的默認excel編碼,發現它是CP1252。我嘗試過使用ICONV('CP1252','UTF-8 // TRANSLIT',$ data),現在,重音字符似乎很適合。我將在腳本中的任何地方嘗試它,看看我的所有重音字符問題是否已修復併發布解決方案(如果有)...

回答

1

無數嘗試後,我能夠解決所有我的編碼問題,但其中一些我仍然不知道他們爲什麼發生。我希望這會稍後給別人一些幫助:

function fixEncoding($data){ 

    //Replace 
    return iconv('CP1252', 'UTF-8//TRANSLIT', $data); 

} 

我現在用這個函數來正確地重新編碼我的字符串。看來,Excel將數據保存爲CP1252而不是utf-8。

此外,如果您使用fgetcsv,似乎在CSV中的字符串開始處有重音字符的錯誤,所以我必須放棄使用fgetcsv並創建替代方法,因爲我不在PHP中5.3,也許str_getcsv可以解決我的問題,我不知道,但在目前的情況下,它不能導致我沒有這個功能。我甚至試圖尋找端口,似乎沒有任何東西存在並正常工作。

這是我的解決方案,雖然很醜陋,它爲我工作:

function fgetcsv2($filepointer, $maxlen, $sep, $enc){ 

    $data = fgets($filepointer, $maxlen); 
    if($data === false){ 
     return false; 
    } 
    $data = explode($sep, $data); 
    return $data; 

} 

好運所有誰得到類似的問題

0

您使用哪種編碼表?

MB_DETECT_ENCODING始終不是100%正確的,並且沒有編碼檢測器可以做到這一點。

+0

我在任何地方都使用UTF-8,並且CSV中的數據應該是UTF-8,因爲我在OpenOffice/LibreOffice中用UTF-8打開它。 –

+0

嘗試粘貼「」「顯示變量(如」char% ;「」「mysql query – abcde123483

1

我也有這樣的項目工作,同時,嚴重,PHPExcel是我的救星,以避免任何brainfuck。

P.S. :另外,還有this link可幫助您開始(法語)。

+0

謝謝,但我沒有閱讀Excel文件,但實際上閱讀來自Excel輸出的CSV文件。我不得不說,是的,PHPExcel在那些時刻是一個救星,儘管在列和內存不足方面受到限制 –

1

我剛剛有一個類似的問題,雖然我使用MB_DETECT_ENCODING測試$值,它表示它是UTF-8,但它仍然截斷了數據。

不知道該怎麼轉換,我無法使用上述的iconv功能。

但是我強制它使用utf8_encode($ value)的UTF-8,現在一切正常。