始終使用UTF-8編碼
P粉548512637
2023-07-24 19:47:11
<p>
我正在設定一個新的伺服器,並希望在我的網路應用程式中完全支援UTF-8。我以前在現有伺服器上嘗試過這個,但似乎總是必須回退到ISO-8859-1。 <br />我需要在哪裡設定編碼/字元集?我知道我需要設定Apache、MySQL和PHP來實現這一點。是否有標準的清單可以供我參考,或是可以排查不符的地方? <br />這是一個運行MySQL 5、PHP 5和Apache 2的新Linux伺服器。 <br /></p><p><br /></p>
我想在chazomaticus的出色回答中補充一點:
也不要忘記META標籤(像這樣,或者HTML4或XHTML版本的):
這似乎是微不足道的,但是IE7以前曾經給我帶來過問題。
我所做的一切都是正確的;資料庫、資料庫連接和Content-Type HTTP頭都設定為UTF-8,在所有其他瀏覽器中都正常工作,但是Internet Explorer仍然堅持使用"西歐"編碼。
結果發現頁面缺少META標籤。增加了之後問題得到解決。
Edit:
#W3C其實有一個相當大的部分專門針對國際化(I18N)問題。他們有許多與此問題相關的文章,涵蓋了HTTP、(X)HTML和CSS方面的內容:
他們建議同時使用HTTP頭和HTML的meta標籤(或以XML形式提供的XHTML中使用XML宣告)。
資料儲存:
#在資料庫中的所有表格和文字列上指定utf8mb4字元集。這樣,MySQL將以UTF-8的本機編碼方式實體儲存和檢索值。請注意,如果指定了utf8mb4_*排序規則(沒有任何明確字元集),MySQL將隱含使用utf8mb4編碼。
在舊版的MySQL(< 5.5.3)中,您將不得不使用僅支援Unicode字元子集的簡單utf8,對此我感到很遺憾,但這是事實。
資料存取:
#在您的應用程式程式碼(例如PHP)中,無論您使用什麼資料庫存取方法,都需要將連接字元集設定為utf8mb4。這樣,當MySQL將資料傳遞給您的應用程式時,它不會進行任何從其本地UTF-8的轉換,反之亦然。
一些驅動程式提供了自己的機制來配置連接字元集,該機制既更新其自身的內部狀態,也通知MySQL在連接上使用的編碼 - 這通常是首選的方法。在PHP中:
如果您使用的是PHP ≥ 5.3.6的PDO抽象層,您可以在DSN中指定字元集:
If you're using mysqli, you can call set_charset():
如果您只能使用普通的mysql函數,但執行的是PHP ≥ 5.2.3,您可以呼叫mysql_set_charset方法。
如果驅動程式沒有提供自己的機制來設定連接字元集,您可能需要發出查詢來告訴MySQL您的應用程式希望如何對連接上的資料進行編碼:SET NAMES 'utf8mb4'。
與上述相同的考慮適用於utf8mb4/utf8。
Output:
#Input:
#其他程式碼注意事項:
#顯然,您提供的所有檔案(PHP、HTML、JavaScript等)都應該以有效的UTF-8進行編碼。
您需要確保每次處理UTF-8字串時都是安全的。不幸的是,這是最困難的部分。您可能需要廣泛使用PHP的mbstring擴充。
PHP的內建字串操作預設不支援UTF-8。有一些您可以安全地使用普通的PHP字串操作(例如拼接),但對於大多數操作,您應該使用等效的mbstring函數。
為了知道自己在做什麼(即不搞砸),您真的需要了解UTF-8以及它在最低級別上的工作原理。請查看utf8.com上的任何鏈接,這些鏈接提供了一些很好的資源,可以讓您學到所需的一切知識。