1

我有一個網站,允許來自世界各地的用戶提交個人資料。在存儲/檢索/顯示字符之間,它們不能正確呈現。我不確定哪一步有問題,但這裏是發生了什麼的細節。在網站上使用字符編碼有困難

當我從我的PostgreSQL數據庫一個SELECT通過psql的命令行界面,我看到一些角色,如出現以下,這使我相信他們是正確保存:

  • ...
  • å

然而,在我的網站,我看到出現上述人物分別如下:

  • â
  • â|

我試圖改變編碼的頭,沒有運氣,從:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

到:

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

我只是尋找一些有關任何PHP設置/函數,PostgreSQL設置,HTML字符集或其他任何我應該查找的信息,以確保爲我的用戶正確顯示所有信息。

回答

3
* � 
* � 
* å 

這種格局表明,他們首先從UTF-8轉換爲ISO-8859-1,然後再從ISO-8859-1UTF-8

首先,你的內容類型頭是好的。保持它UTF-8

錯誤地使用ISO-8859-1錯誤地在查詢來自數據庫的數據和發送輸出到響應之間的代碼邏輯。這包括從數據庫查詢數據的步驟。我會先從第一步開始。嘗試,如果pg_set_client_encoding幫助:描述here

pg_set_client_encoding($connection, 'UTF8'); 

其他步驟。希望這可以幫助。

+0

感謝您的幫助!正如你所指出的,我需要通過pg_set_client_encoding()來設置客戶端編碼。之後,我還必須更改各種調用htmlentities()以傳遞「UTF-8」作爲第三個參數,現在一切看起來都不錯。非常感激! – 2009-11-12 22:57:17

0

我猜這個問題是在瀏覽器或網絡服務器 - 這些UTF-8序列被誤讀爲拉丁-1。如果網絡服務器發送標籤爲Latin-1的HTTP標頭,那麼它會覆蓋文件中的任何內容。 Web服務器需要不聲明字符集(在這種情況下查閱文檔),或者聲明正確的字符集(即UTF-8)。如果這樣做不切實際,則解決方法是使用&#引用來處理基本0-127 ASCII範圍之外的字符,並將它們呈現爲HTML。

1

您可能需要在Postgres中設置您的客戶端編碼。 http://developer.postgresql.org/pgdocs/postgres/multibyte.html

此外,您可能必須在HTTP頭(而不是隻是元標記)中執行此操作。如果您使用的是PHP,請撥打:

header("Content-Type: text/html; charset=UTF-8"); 

確保在讀取和寫入數據庫時​​使用相同的客戶端編碼。

+0

我在提問時忽略了一些問題,但我使用了CakePHP框架的內置HtmlHelper :: meta方法,它爲我處理所有事情。感謝您爲所有遇到此問題的人指出這一點,並且需要在他們的PHP應用程序中執行相同的操作。 – 2009-11-12 22:58:38