我有一個功能,上傳使用fgetcsv
等用戶提交的CSV文件上傳UTF-8的關注
我的數據庫有utf8_general_ci和網站字符集的排序規則設置爲UTF-提交的CSV文件導入我的數據庫中的用戶8。
如何確保將數據從CSV插入到我的數據庫中以便在網站上顯示時,正確的編碼已設置?
我必須使用類似mb_detect_encoding
(看起來有點內存密集)的東西來測試每個字符串嗎?或者我可以只用utf8_encode
整個字符串。還是我應該不擔心?
我有一個功能,上傳使用fgetcsv
等用戶提交的CSV文件上傳UTF-8的關注
我的數據庫有utf8_general_ci和網站字符集的排序規則設置爲UTF-提交的CSV文件導入我的數據庫中的用戶8。
如何確保將數據從CSV插入到我的數據庫中以便在網站上顯示時,正確的編碼已設置?
我必須使用類似mb_detect_encoding
(看起來有點內存密集)的東西來測試每個字符串嗎?或者我可以只用utf8_encode
整個字符串。還是我應該不擔心?
自動檢測用戶提交文件的編碼的確非常不穩定。
考慮一個人工的方法:
讓用戶上傳文件。
在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ÄÜÜ在其他所有方面都不相同。
注意,編碼檢測是接近無用的,如果文件從世界各地來的(即可以有任何編碼)
我真想讓這對用戶透明。將在弦上做一個函數utf8_encode至少確保正確的編碼設置不管,否則會搞砸所有的數據了嗎? – fire 2011-04-19 09:09:42
*我把這個評論的內容放入答案* – 2011-04-19 09:11:58
是的,這就是我的想法!該死的字符編碼! – fire 2011-04-19 09:14:37