搜尋

首頁  >  問答  >  主體

始終使用UTF-8編碼

<p> 我正在設定一個新的伺服器,並希望在我的網路應用程式中完全支援UTF-8。我以前在現有伺服器上嘗試過這個,但似乎總是必須回退到ISO-8859-1。 <br />我需要在哪裡設定編碼/字元集?我知道我需要設定Apache、MySQL和PHP來實現這一點。是否有標準的清單可以供我參考,或是可以排查不符的地方? <br />這是一個運行MySQL 5、PHP 5和Apache 2的新Linux伺服器。 <br /></p><p><br /></p>
P粉548512637P粉548512637496 天前493

全部回覆(2)我來回復

  • P粉138871485

    P粉1388714852023-07-25 16:40:26

    我想在chazomaticus的出色回答中補充一點:

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

    <meta charset="utf-8">

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

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

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


    Edit:

    #

    W3C其實有一個相當大的部分專門針對國際化(I18N)問題。他們有許多與此問題相關的文章,涵蓋了HTTP、(X)HTML和CSS方面的內容:

    他們建議同時使用HTTP頭和HTML的meta標籤(或以XML形式提供的XHTML中使用XML宣告)。

    回覆
    0
  • P粉381463780

    P粉3814637802023-07-25 09:11:32

    資料儲存:

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

        $dbh = new PDO('mysql:charset=utf8mb4');
      • If you're using mysqli, you can call 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 NAMES 'utf8mb4'。

    • 與上述相同的考慮適用於utf8mb4/utf8。

    Output:

    #
    • 應該在HTTP頭中設定UTF-8,例如Content-Type: text/html; charset=utf-8。您可以透過在php.ini中設定default_charset(首選)或使用header()函數手動設定來實現。
    • 如果您的應用程式將文字傳輸到其他系統,它們也需要被告知字元編碼。對於網路應用程序,瀏覽器必須被告知資料發送的編碼方式(透過HTTP回應頭或HTML元資料)。
    • 在使用json_encode()進行輸出編碼時,將JSON_UNESCAPED_UNICODE作為第二個參數加入。

    Input:

    #
    • 瀏覽器將以文件指定的字元集提交數據,因此在輸入方面不需要做任何特殊處理。
    • 如果您對請求編碼有疑問(可能被篡改),在嘗試儲存或在任何地方使用之前,您可以驗證每個接收到的字串是否為有效的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
  • 取消回覆