我正在設(shè)置一個(gè)新服務(wù)器,并希望在我的 Web 應(yīng)用程序中完全支持 UTF-8。我過去曾在現(xiàn)有服務(wù)器上嘗試過此操作,但似乎總是最終不得不退回到 ISO-8859-1。
我到底需要在哪里設(shè)置編碼/字符集?我知道我需要配置 Apache、MySQL 和 PHP 來執(zhí)行此操作 - 是否有一些我可以遵循的標(biāo)準(zhǔn)檢查表,或者也許可以對發(fā)生不匹配的位置進(jìn)行故障排除?
這適用于運(yùn)行 MySQL 5、PHP、5 和 Apache 2 的新 Linux 服務(wù)器。
我想在 chazomaticus 的出色答案中添加一件事一個(gè)>:
也不要忘記 META 標(biāo)記(像這樣,或者 它的 HTML4 或 XHTML 版本):
這看起來微不足道,但 IE7 之前曾給我?guī)磉^問題。
我做的一切都是正確的;數(shù)據(jù)庫、數(shù)據(jù)庫連接和Content-Type HTTP標(biāo)頭都設(shè)置為UTF-8,在所有其他瀏覽器中都運(yùn)行良好,但I(xiàn)nternet Explorer仍然堅(jiān)持使用“西歐”編碼。
原來該頁面缺少 META 標(biāo)記。添加即可解決問題。
編輯:
W3C 實(shí)際上有一個(gè)相當(dāng)大的專門討論 I18N 的部分。他們有許多與此問題相關(guān)的文章 - 描述了 HTTP、(X)HTML 和 CSS 方面的內(nèi)容:
他們建議同時(shí)使用 HTTP 標(biāo)頭和 HTML 元標(biāo)記(或者在 XHTML 充當(dāng) XML 的情況下使用 XML 聲明)。
數(shù)據(jù)存儲(chǔ):
為數(shù)據(jù)庫中的所有表和文本列指定 utf8mb4
字符集。這使得 MySQL 物理存儲(chǔ)和檢索以 UTF-8 原生編碼的值。請注意,如果指定了 utf8mb4_*
排序規(guī)則(沒有任何顯式字符集),MySQL 將隱式使用 utf8mb4
編碼。
在舊版本的 MySQL (utf8,它僅支持 Unicode 字符的子集。我希望我是在開玩笑。
數(shù)據(jù)訪問:
在您的應(yīng)用程序代碼(例如 PHP)中,無論您使用哪種數(shù)據(jù)庫訪問方法,您都需要將連接字符集設(shè)置為 utf8mb4
。這樣,當(dāng) MySQL 將數(shù)據(jù)傳遞給您的應(yīng)用程序時(shí),它不會(huì)從其本機(jī) UTF-8 進(jìn)行轉(zhuǎn)換,反之亦然。
某些驅(qū)動(dòng)程序提供自己的機(jī)制來配置連接字符集,該機(jī)制既更新其自身的內(nèi)部狀態(tài),又通知 MySQL 連接上要使用的編碼 - 這通常是首選方法。在 PHP 中:
如果您使用 PDO 抽象層對于 PHP ≥ 5.3.6,您可以在 DSN:
$dbh = new PDO('mysql:charset=utf8mb4');
如果您使用mysqli,您可以調(diào)用 set_charset()
:
$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
如果你堅(jiān)持使用普通的 mysql 但碰巧運(yùn)行 PHP ≥ 5.2.3,您可以調(diào)用 mysql_set_charset代碼>
.
如果驅(qū)動(dòng)程序沒有提供自己的機(jī)制來設(shè)置連接字符集,您可能必須發(fā)出查詢來告訴 MySQL 您的應(yīng)用程序期望連接上的數(shù)據(jù)如何編碼:設(shè)置名稱'utf8mb4'
。
對于 utf8mb4
/utf8
的考慮同樣適用,如上所述。
輸出:
Content-Type:text/html;字符集=utf-8
。您可以通過設(shè)置 default_charset code>
在 php.ini 中(首選),或手動(dòng)使用 header()
函數(shù)。json_encode()
對輸出進(jìn)行編碼時(shí),添加 JSON_UNESCAPED_UNICODE
作為第二個(gè)參數(shù)。輸入:
mb_check_encoding()
執(zhí)行以下操作:技巧,但你必須虔誠地使用它。確實(shí)沒有辦法解決這個(gè)問題,因?yàn)閻阂饪蛻舳丝梢砸运麄兿胍娜魏尉幋a提交數(shù)據(jù),而且我還沒有找到讓 PHP 可靠地為您執(zhí)行此操作的技巧。其他代碼注意事項(xiàng):
顯然,您將提供的所有文件(PHP、HTML、JavaScript 等)都應(yīng)使用有效的 UTF-8 進(jìn)行編碼。
您需要確保每次處理 UTF-8 字符串時(shí)都是安全的。不幸的是,這是最困難的部分。您可能希望廣泛使用 PHP 的 mbstring
擴(kuò)展名。
默認(rèn)情況下,PHP 的內(nèi)置字符串操作不是 UTF-8 安全的。您可以使用正常的 PHP 字符串操作安全地執(zhí)行一些操作(例如連接),但對于大多數(shù)情況,您應(yīng)該使用等效的 mbstring
函數(shù)。
要知道您在做什么(閱讀:不要搞砸),您確實(shí)需要了解 UTF-8 以及它如何在盡可能最低的級別上工作。查看 utf8.com 中的任何鏈接,獲取一些很好的資源,以了解您需要了解的所有內(nèi)容。 p>