搜尋

首頁  >  問答  >  主體

自始至終擁抱 UTF-8

我正在設定一個新伺服器,並希望在我的 Web 應用程式中完全支援 UTF-8。我過去曾在現有伺服器上嘗試過此操作,但似乎總是最終不得不退回到 ISO-8859-1。

我到底需要在哪裡設定編碼/字元集?我知道我需要配置 Apache、MySQL 和 PHP 來執行此操作 - 是否有一些我可以遵循的標準檢查表,或者也許可以對發生不匹配的位置進行故障排除?

這適用於執行 MySQL 5、PHP、5 和 Apache 2 的新 Linux 伺服器。

P粉925239921P粉925239921408 天前839

全部回覆(2)我來回復

  • P粉482108310

    P粉4821083102023-10-16 00:11:18

    我想在 chazomaticus 的出色答案中添加一件事

    也不要忘記 META 標籤(像這樣,或 它的 HTML4 或 XHTML 版本):

    這看起來微不足道,但 IE7 之前曾經給我帶來過問題。

    我所做的一切都是正確的;資料庫、資料庫連接和Content-Type HTTP標頭都設定為UTF-8,在所有其他瀏覽器中都運作良好,但Internet Explorer仍然堅持使用「西歐」編碼。

    原來該頁面缺少 META 標記。添加即可解決問題。

    編輯:

    W3C 其實有一個相當大的專門討論 I18N 的部分。他們有許多與此問題相關的文章 - 描述了 HTTP、(X)HTML 和 CSS 方面的內容:

    他們建議同時使用 HTTP 標頭和 HTML 元標記(或在 XHTML 充當 XML 的情況下使用 XML 宣告)。

    回覆
    0
  • P粉457445858

    P粉4574458582023-10-16 00:05:39

    資料儲存

    • 為資料庫中的所有表格和文字列指定 utf8mb4 字元集。這使得 MySQL 物理儲存和檢索以 UTF-8 原生編碼的值。請注意,如果指定了 utf8mb4_* 排序規則(沒有任何明確字元集),MySQL 將隱含使用 utf8mb4 編碼。

    • 在舊版的 MySQL (< 5.5.3) 中,不幸的是,您將被迫只使用 < 5.5.3) 中,不幸的是,您将被迫仅使用 utf8,它只支援 Unicode 字元的子集。我希望我是在開玩笑。

    資料存取

    • 在您的應用程式程式碼(例如 PHP)中,無論您使用哪種資料庫存取方法,您都需要將連接字元集設定為 utf8mb4。這樣,當 MySQL 將資料傳遞給您的應用程式時,它不會從其本機 UTF-8 進行轉換,反之亦然。

    • 某些驅動程式提供自己的機制來配置連接字元集,該機制既更新其自身的內部狀態,又通知 MySQL 連接上要使用的編碼 - 這通常是首選方法。在 PHP 中:

      • 如果您使用PDO 抽象層對於PHP ≥ 5.3.6,您可以在DSN

        $dbh = new PDO('mysql:charset=utf8mb4');
      • 如果您使用mysqli,您可以呼叫 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 您的應用程式期望連接上的資料如何編碼:設定名稱'utf8mb4 '

    • 對於 utf8mb4/utf8 的考慮同樣適用,如上所述。

    輸出

    • HTTP頭中應設定UTF-8,如Content-Type:text/html;字元集=utf-8。您可以透過設定 default_charset 在 php.ini 中(首選),或手動使用 header() 函數。
    • 如果您的應用程式將文字傳輸到其他系統,它們還需要了解字元編碼。對於 Web 應用程序,必須告知瀏覽器發送資料的編碼(透過 HTTP 回應標頭或 HTML 元資料)。 < /里>
    • 使用 json_encode() 對輸出進行編碼時,新增 JSON_UNESCAPED_UNICODE 作為第二個參數。

    輸入

    • 瀏覽器將以為文件指定的字元集提交數據,因此無需對輸入執行任何特殊操作。
    • 如果您對請求編碼有疑問(以防它可能被篡改),您可以在嘗試儲存或在任何地方使用它之前驗證每個收到的字串是否為有效的 UTF-8。 PHP 的 mb_check_encoding() 執行以下操作:技巧,但你必須虔誠地使用它。確實沒有辦法解決這個問題,因為惡意客戶端可以以他們想要的任何編碼提交數據,而且我還沒有找到讓 PHP 可靠地為您執行此操作的技巧。

    其他程式碼注意事項

    • 顯然,您將提供的所有檔案(PHP、HTML、JavaScript 等)都應使用有效的 UTF-8 進行編碼。

    • 您需要確保每次處理 UTF-8 字串時都是安全的。不幸的是,這是最困難的部分。您可能想要廣泛使用 PHP 的 mbstring 副檔名。

    • 預設情況下,PHP 的內建字串操作是 UTF-8 安全的。 您可以使用正常的 PHP 字串操作安全地執行一些操作(例如連接),但對於大多數情況,您應該使用等效的 mbstring 函數。

    • 要知道您在做什麼(閱讀:不要搞砸),您確實需要了解 UTF-8 以及它如何在盡可能最低的級別上工作。查看 utf8.com 中的任何鏈接,獲取一些很好的資源,以了解您需要了解的所有內容。

    回覆
    0
  • 取消回覆