84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
我正在設定一個新伺服器,並希望在我的 Web 應用程式中完全支援 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 元標記(或在 XHTML 充當 XML 的情況下使用 XML 宣告)。
資料儲存:
為資料庫中的所有表格和文字列指定 utf8mb4 字元集。這使得 MySQL 物理儲存和檢索以 UTF-8 原生編碼的值。請注意,如果指定了 utf8mb4_* 排序規則(沒有任何明確字元集),MySQL 將隱含使用 utf8mb4 編碼。
utf8mb4
utf8mb4_*
在舊版的 MySQL (utf8,它只支援 Unicode 字元的子集。我希望我是在開玩笑。
資料存取:
在您的應用程式程式碼(例如 PHP)中,無論您使用哪種資料庫存取方法,您都需要將連接字元集設定為 utf8mb4。這樣,當 MySQL 將資料傳遞給您的應用程式時,它不會從其本機 UTF-8 進行轉換,反之亦然。
某些驅動程式提供自己的機制來配置連接字元集,該機制既更新其自身的內部狀態,又通知 MySQL 連接上要使用的編碼 - 這通常是首選方法。在 PHP 中:
如果您使用PDO 抽象層對於PHP ≥ 5.3.6,您可以在DSN:
$dbh = new PDO('mysql:charset=utf8mb4');
如果您使用mysqli,您可以呼叫 set_charset():
set_charset()
$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
如果你堅持使用普通的 mysql 但碰巧運行 PHP ≥ 5.2.3,你可以呼叫 mysql_set_charset代码>.
mysql_set_charset代码>
如果驅動程式沒有提供自己的機制來設定連接字元集,您可能必須發出查詢來告訴MySQL 您的應用程式期望連接上的資料如何編碼:設定名稱'utf8mb4 '。
設定名稱'utf8mb4 '
對於 utf8mb4/utf8 的考慮同樣適用,如上所述。
utf8
輸出:
Content-Type:text/html;字元集=utf-8
default_charset code>
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 中的任何鏈接,獲取一些很好的資源,以了解您需要了解的所有內容。 p>
我想在 chazomaticus 的出色答案中添加一件事一个>:
也不要忘記 META 標籤(像這樣,或 它的 HTML4 或 XHTML 版本):
這看起來微不足道,但 IE7 之前曾經給我帶來過問題。
我所做的一切都是正確的;資料庫、資料庫連接和Content-Type HTTP標頭都設定為UTF-8,在所有其他瀏覽器中都運作良好,但Internet Explorer仍然堅持使用「西歐」編碼。
原來該頁面缺少 META 標記。添加即可解決問題。
編輯:
W3C 其實有一個相當大的專門討論 I18N 的部分。他們有許多與此問題相關的文章 - 描述了 HTTP、(X)HTML 和 CSS 方面的內容:
他們建議同時使用 HTTP 標頭和 HTML 元標記(或在 XHTML 充當 XML 的情況下使用 XML 宣告)。
資料儲存:
為資料庫中的所有表格和文字列指定
utf8mb4
字元集。這使得 MySQL 物理儲存和檢索以 UTF-8 原生編碼的值。請注意,如果指定了utf8mb4_*
排序規則(沒有任何明確字元集),MySQL 將隱含使用utf8mb4
編碼。在舊版的 MySQL (utf8,它只支援 Unicode 字元的子集。我希望我是在開玩笑。
資料存取:
在您的應用程式程式碼(例如 PHP)中,無論您使用哪種資料庫存取方法,您都需要將連接字元集設定為
utf8mb4
。這樣,當 MySQL 將資料傳遞給您的應用程式時,它不會從其本機 UTF-8 進行轉換,反之亦然。某些驅動程式提供自己的機制來配置連接字元集,該機制既更新其自身的內部狀態,又通知 MySQL 連接上要使用的編碼 - 這通常是首選方法。在 PHP 中:
如果您使用PDO 抽象層對於PHP ≥ 5.3.6,您可以在DSN:
如果您使用mysqli,您可以呼叫
set_charset()
:如果你堅持使用普通的 mysql 但碰巧運行 PHP ≥ 5.2.3,你可以呼叫
mysql_set_charset代码>
.如果驅動程式沒有提供自己的機制來設定連接字元集,您可能必須發出查詢來告訴MySQL 您的應用程式期望連接上的資料如何編碼:
設定名稱'utf8mb4 '
。對於
utf8mb4
/utf8
的考慮同樣適用,如上所述。輸出:
Content-Type:text/html;字元集=utf-8
。您可以透過設定default_charset code>
在 php.ini 中(首選),或手動使用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 中的任何鏈接,獲取一些很好的資源,以了解您需要了解的所有內容。 p>