標題重寫為:"全程使用UTF-8編碼"
P粉321676640
P粉321676640 2023-08-21 21:12:13
0
2
457
<p> 我正在設定一個新的伺服器,並希望在我的網路應用程式中完全支援UTF-8。我曾經在現有伺服器上嘗試過這個,但總是必須回退到ISO-8859-1。 </p> <p>我需要在哪裡設定編碼/字元集?我知道我需要設定Apache,MySQL和PHP來實現這一點 - 是否有一些標準的檢查清單可以遵循,或者可以排除不匹配的地方嗎? </p> <p>這是一個運行MySQL 5,PHP 5和Apache 2的新Linux伺服器。 </p>
P粉321676640
P粉321676640

全部回覆(2)
P粉790187507

我想在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宣告)。

P粉653045807

資料儲存:

  • #在資料庫中的所有表格和文字列上指定utf8mb4字元集。這樣,MySQL會以UTF-8的原生編碼方式實體儲存和檢索值。請注意,如果指定了utf8mb4_*排序規則(而沒有明確指定字元集),MySQL將隱含使用utf8mb4編碼。

  • 在舊版的MySQL(< 5.5.3)中,你只能使用只支援Unicode字元子集的utf8。我希望我在開玩笑。

資料存取:

  • #在應用程式程式碼(例如PHP)中,無論你使用什麼資料庫存取方法,你都需要將連接字元集設定為utf8mb4。這樣,MySQL在將資料傳遞給應用程式和反之時不會對其進行任何轉換。

  • 一些驅動程式提供了自己的機制來配置連接字元集,這既更新了其自身的內部狀態,也通知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的注意事項也適用於此。

輸出:

  • UTF-8應該在HTTP頭中設置,例如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的連結中有一些很好的資源,可以學習你需要知道的一切。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!