首頁  >  問答  >  主體

“始終如一地擁抱 UTF-8”

<p> 我正在設定一個新的伺服器,並希望在我的網路應用程式中完全支援UTF-8。過去我在現有伺服器上嘗試過這個,但總是不得不退回到ISO-8859-1。 </p> <p>我需要在哪裡設定編碼/字元集?我知道我需要設定Apache,MySQL和PHP來實現這一點 - 是否有一些標準的檢查清單我可以遵循,或者可以排查不匹配的地方嗎? </p> <p>這是一個運行MySQL 5,PHP 5和Apache 2的新Linux伺服器。 </p>
P粉404539732P粉404539732395 天前471

全部回覆(2)我來回復

  • P粉497463473

    P粉4974634732023-08-21 16:20:46

    我想在chazomaticus的出色回答中添加一點內容:

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

    <meta charset="utf-8">

    這似乎是微不足道的,但IE7以前給我帶來了問題。

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

    結果發現頁面缺少META標籤。新增了之後問題解決了。

    編輯:

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

    他們建議同時使用HTTP頭和HTML meta標籤(或在作為XML提供的XHTML的情況下使用XML宣告)。

    回覆
    0
  • P粉726133917

    P粉7261339172023-08-21 14:32:48

    資料儲存:

    • #在資料庫中的所有表格和文字列上指定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

        $dbh = new PDO('mysql:charset=utf8mb4');
      • 如果您使用的是mysqli,您可以呼叫set_charset()

        $mysqli->set_charset('utf8mb4');       // 面向对象的样式
          mysqli_set_charset($link, 'utf8mb4');  // 过程化的样式
      • 如果您被限制使用純mysql,但恰好運行的是PHP ≥ 5.2.3,您可以呼叫mysql_set_charset#。

    • 如果驅動程式沒有提供自己的設定連接字元集的機制,您可能需要發出查詢來告訴MySQL您的應用程式希望在連接上如何編碼資料:SET NAMES 'utf8mb4 '

    • 與上述相同的關於utf8mb4/utf8的注意事項也適用於此。

    輸出:

    • 應在HTTP頭中設定UTF-8,例如Content-Type: text/html; charset=utf-8。您可以透過在php.ini中設定default_charset(首選)或手動使用header()函數來實現。
    • 如果您的應用程式將文字傳輸到其他系統,它們也需要被告知字元編碼。對於網頁應用程序,瀏覽器必須被告知以哪種編碼方式發送資料(透過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
  • 取消回覆