2012-08-27 73 views
1

我知道有很多像這樣的問題,但我正在創建新的問題,因爲以我的觀點來看,它是針對每種情況的。mysql + php編碼

因此,我的頁面顯示爲UTF-8格式。數據取自於有utf8_unicode_ci collation的mySQL。我顯示的數據是字符串 - 1  Bröllops-Festkläder

在這裏有一些unicode字符,他們應該顯示正常,但他們沒有。在我的頁面上,這些只是一堆象形文字。

現在,有趣的情況:

我使用phpMyAdmin來跟蹤什麼是數據庫中發生的事情。該網站可以導入包含客戶數據的CSV文件並單獨修改每個客戶。如果我導入包含這些字符的CSV文檔,它們將被寫入數據庫,在phpMyAdmin中可讀並且在我的頁面上不可讀。如果我使用我的腳本修改客戶信息並從瀏覽器中鍵入這些字符,則反之亦然 - 它們在頁面上可讀,並且在phpMyAdmin中不可讀,因此編碼顯然不同。我花了很多年找出正確的組合,但我不能。

UPDATE:Deceze發佈了一個下面的鏈接,我在這裏複製它使其更引人注目。我相信這將爲許多面臨類似問題的人節省幾個小時和幾天的時間 - Handling Unicode Front to Back in a Web App

+0

請添加條形碼或鏈接到您的網站。 –

+1

在這裏深入解釋:[在Web應用程序中處理Unicode前後](http://kunststube.net/frontback/) – deceze

+0

@deceze,而之前,這幫助我瞭解了很多東西。感謝您的寫作。 – Adi

回答

3

有幾件事涉及到這裏。如果你的數據庫編碼很好,並且html編碼很好,而且你仍然看到artefact,那麼很可能你的db連接不使用相同的編碼,從而導致數據損壞。如果你手動連接,你可以很容易地強制執行utf編碼,通過查詢SET NAMES UTF8作爲第一件事情後,你connect()到您的數據庫。每個連接只做一次就足夠了。

編輯:雖然一個重要的注意事項 - 取決於你如何把你的數據到數據庫,你的數據庫內容可能需要修復,因爲如果你通過斷開的連接它可能會損壞。所以,如果任何人面臨同樣的問題 - 一旦你設置了所有的東西,確保你正在檢查新鮮的數據集,或者你仍然可能看到錯誤的東西,即使現在都好。

+0

不要查詢「SET NAMES」,請使用「mysql_set_charset」。 – deceze

+0

在PDO變化,這是$分貝=新PDO( 「MySQL的:主機= HOST; DBNAME = DBNAME」, 「登錄」, 「PASS」, \t \t陣列(PDO :: MYSQL_ATTR_INIT_COMMAND> 'SET NAMES UTF8') \t); –

+1

請勿使用mysql_ *擴展名。使用mysqli_ * :)無論如何,我的答案是 - 除了數據庫模式和網站編碼,還有數據庫鏈接,也可以破壞你的數據。這對許多人來說並不明顯。你解決這個問題的方式是不相關的,取決於使用的庫/驅動程序。例如,如果您要使用Zend Framework,則應該將'resources.db.params.charset = UTF8'添加到您的application.ini文件中 –