84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
我正在設定一個新的伺服器,並希望在我的網路應用程式中完全支援UTF-8編碼。過去我在現有的伺服器上嘗試過這個,但總是不得不退回到ISO-8859-1編碼。
我需要在哪裡設定編碼/字元集?我知道我需要配置Apache、MySQL和PHP來實現這一點 - 是否有一些標準的檢查清單我可以遵循,或者可以排除不匹配的問題的故障排除方法?
這是一個運行MySQL 5、PHP 5和Apache 2的新Linux伺服器。
我想對chazomaticus的優秀回答補充一點:
不要忘記META標籤(像這樣,或它的HTML4或XHTML版本):
這似乎微不足道,但IE7以前曾經給我帶來麻煩。
我所做的一切都是正確的;資料庫、資料庫連接和Content-Type HTTP頭都設定為UTF-8,在所有其他瀏覽器中都正常工作,但Internet Explorer仍然堅持使用「西歐」編碼。
結果發現頁面缺少META標籤。新增後問題解決。
編輯:
實際上,W3C有一個相當大的專門用於I18N的部分。他們有許多與此問題相關的文章 - 描述了HTTP、(X)HTML和CSS方面的內容:
他們建議同時使用HTTP頭和HTML meta標籤(或在以XML形式提供的XHTML的情況下使用XML宣告)。
資料儲存:
#在資料庫中的所有表格和文字列上指定utf8mb4字元集。這使得MySQL在物理上儲存和檢索以UTF-8編碼的值。請注意,如果指定了utf8mb4_*校對(沒有任何明確字元集),MySQL將隱式使用utf8mb4編碼。
utf8mb4
utf8mb4_*
在舊版的MySQL(< 5.5.3)中,您將不得不使用僅支援Unicode字元子集的utf8。我希望我是在開玩笑。
utf8
資料存取:
#在應用程式程式碼中(例如PHP),無論使用什麼資料庫存取方法,您都需要將連接字元集設定為utf8mb4。這樣,MySQL在將資料傳遞給應用程式和反之時,不會進行任何從其本地UTF-8的轉換。
某些驅動程式提供了自己的機制來配置連接字元集,該機制既更新其自身的內部狀態,又通知MySQL要在連接上使用的編碼-這通常是首選的方法。在PHP中:
如果您使用的是PHP ≥ 5.3.6的PDO抽象層,您可以在DSN中指定charset:
charset
$dbh = new PDO('mysql:charset=utf8mb4');
如果您使用的是mysqli,您可以呼叫set_charset():
set_charset()
$mysqli->set_charset('utf8mb4'); // 面向对象风格 mysqli_set_charset($link, 'utf8mb4'); // 过程化风格
如果您被困在純mysql中,但碰巧運行的是PHP ≥ 5.2.3,您可以呼叫mysql_set_charset#。
mysql_set_charset
如果驅動程式沒有提供自己的設定連接字元集的機制,您可能需要發出查詢來告訴MySQL應用程式在連接上期望資料的編碼:SET NAMES 'utf8mb4'。
SET NAMES 'utf8mb4'
與上述相同的關於utf8mb4/utf8的考慮也適用於此。
輸出:
Content-Type: text/html; charset=utf-8
default_charset
header()
json_encode()
JSON_UNESCAPED_UNICODE
輸入:
mb_check_encoding()
其他程式碼注意事項:
顯然,您將提供的所有檔案(PHP、HTML、JavaScript等)都應該以有效的UTF-8進行編碼。
您需要確保每次處理UTF-8字串時都能安全進行。這是非常困難的部分。您可能需要廣泛使用PHP的mbstring擴充。
mbstring
PHP的內建字串操作預設情況下不是UTF-8安全的。您可以使用普通的PHP字串操作(如連接)來安全地執行某些操作,但對於大多數操作,您應該使用等效的mbstring函數。
要知道自己在做什麼(即不要搞砸),您真的需要了解UTF-8以及它在最低級別上的工作方式。查看utf8.com上的任何鏈接,了解您需要知道的一切。
我想對chazomaticus的優秀回答補充一點:
不要忘記META標籤(像這樣,或它的HTML4或XHTML版本):
這似乎微不足道,但IE7以前曾經給我帶來麻煩。
我所做的一切都是正確的;資料庫、資料庫連接和Content-Type HTTP頭都設定為UTF-8,在所有其他瀏覽器中都正常工作,但Internet Explorer仍然堅持使用「西歐」編碼。
結果發現頁面缺少META標籤。新增後問題解決。
編輯:
實際上,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中指定
charset
:如果您使用的是mysqli,您可以呼叫
set_charset()
:如果您被困在純mysql中,但碰巧運行的是PHP ≥ 5.2.3,您可以呼叫
mysql_set_charset
#。如果驅動程式沒有提供自己的設定連接字元集的機制,您可能需要發出查詢來告訴MySQL應用程式在連接上期望資料的編碼:
SET NAMES 'utf8mb4'
。與上述相同的關於
utf8mb4
/utf8
的考慮也適用於此。輸出:
Content-Type: text/html; charset=utf-8
。您可以透過在php.ini中設定default_charset
(首選)或手動使用header()
函數來實現。json_encode()
對輸出進行編碼時,將JSON_UNESCAPED_UNICODE
作為第二個參數新增。輸入:
mb_check_encoding()
#可以解決這個問題,但您必須嚴格使用它。實際上沒有繞過此問題的方法,因為惡意客戶端可以以任何他們想要的編碼提交數據,而我還沒有找到一個可靠地讓PHP為您執行此操作的技巧。其他程式碼注意事項:
顯然,您將提供的所有檔案(PHP、HTML、JavaScript等)都應該以有效的UTF-8進行編碼。
您需要確保每次處理UTF-8字串時都能安全進行。這是非常困難的部分。您可能需要廣泛使用PHP的
mbstring
擴充。PHP的內建字串操作預設情況下不是UTF-8安全的。您可以使用普通的PHP字串操作(如連接)來安全地執行某些操作,但對於大多數操作,您應該使用等效的
mbstring
函數。要知道自己在做什麼(即不要搞砸),您真的需要了解UTF-8以及它在最低級別上的工作方式。查看utf8.com上的任何鏈接,了解您需要知道的一切。