2011-04-19 33 views
0

我有一個功能,上傳使用fgetcsv用戶提交的CSV文件上傳UTF-8的關注

我的數據庫有utf8_general_ci和網站字符集的排序規則設置爲UTF-提交的CSV文件導入我的數據庫中的用戶8。

如何確保將數據從CSV插入到我的數據庫中以便在網站上顯示時,正確的編碼已設置?

我必須使用類似mb_detect_encoding(看起來有點內存密集)的東西來測試每個字符串嗎?或者我可以只用utf8_encode整個字符串。還是我應該不擔心?

回答

1

自動檢測用戶提交文件的編碼的確非常不穩定。

考慮一個人工的方法:

  • 讓用戶上傳文件。

  • iframe中,向他們展示數據將如何插入的預覽。 (就像OpenOffice在將未知文件導入電子表格時所做的那樣)。這方面的一個例證是here

  • 旁邊的是,顯示一個下拉提供所有相關的編碼。

  • 如果用戶切換到一個不同的編碼,更新預覽上的即時使用iconv()

    $data = iconv($chosen_encoding, "utf-8", $data); 
    
  • 一旦用戶已確認該數據是在所選擇的編碼正確顯示,做關於數據的最終iconv()並將其插入到數據庫中。

這樣做的缺點是,用戶需要被教育的一個問題,他們是最有可能的無知,這是正確的不感興趣。但它是確保進入該數據的唯一方法系統沒問題。

回覆您的評論:

我真想讓這對用戶透明。將在弦上做一個函數utf8_encode至少確保正確的編碼設置不管,否則會搞砸所有的數據了嗎?

utf8_encode只是iconv(「iso-8859-1」,「utf-8」,$ data)的同義詞。如果傳入的數據不是ISO-8859-1,它將被過程搞亂。這是一個棘手的問題。不幸的是,由於ISO-8859-1和UTF-8共享相同的一組基本(ASCII)字符,但不幸的是,您需要嘗試使用mb_detect_encoding的運氣。像UmlautsÄÜÜ在其他所有方面都不相同。

注意,編碼檢測是接近無用的,如果文件從世界各地來的(即可以有任何編碼)

+0

我真想讓這對用戶透明。將在弦上做一個函數utf8_encode至少確保正確的編碼設置不管,否則會搞砸所有的數據了嗎? – fire 2011-04-19 09:09:42

+0

*我把這個評論的內容放入答案* – 2011-04-19 09:11:58

+0

是的,這就是我的想法!該死的字符編碼! – fire 2011-04-19 09:14:37