」設定整個頁面的字元編碼;2、在php中透過「header("content-type:text/html; charset=xxx");」設定字元即可。"/> 」設定整個頁面的字元編碼;2、在php中透過「header("content-type:text/html; charset=xxx");」設定字元即可。">

首頁 >後端開發 >PHP問題 >php html頁面中文亂碼問題怎麼解決

php html頁面中文亂碼問題怎麼解決

藏色散人
藏色散人原創
2023-01-20 09:21:134442瀏覽

php html頁面中文亂碼問題的解決方法:1、在前端透過「」設定整個頁面的字元編碼;2、在php中透過「header("content-type:text/html ; charset=xxx");”設定字元即可。

php html頁面中文亂碼問題怎麼解決

本教學操作環境:Windows10系統、PHP8.1版、DELL G3電腦

php html頁面中文亂碼問題怎麼解決?

前端網頁、php與mysql資料庫字元編碼(解決中文等亂碼問題 

web開發中常涉及前端網頁-php— —mysql之間的資料交互,當資料只有英文時通常不會有什麼問題,但一旦涉及中文,三個地方的某一處字符編碼不一致(如,網頁使用的時gbk而mysql使用utf-8)就有可能導致亂碼的出現。

(註:關於字元編碼請參考百度百科:http://baike.baidu.com/view/1204863.htm?fr=aladdin)

前端網頁編碼:

通常我們都認為可以透過標籤內的項目(如)來設定整個頁面的字元編碼。大部分頁面可以採用這種方式來告訴瀏覽器顯示這個頁面的時候採用什麼編碼,但是有的時候我們會發現有了這句還是不行,不管xxx是哪一種,瀏覽器採用的始終都是一種編碼。

這種情況涉及到http協議通信中的頭部(header)部分,實際上,當使用者瀏覽網頁時,伺服器傳送給使用者的內容不僅包括我們的網頁(包括html/css/js這些程式碼內容),還包括被稱為頭部(header)的描述性內容,這些內容會告知客戶端將要接收的資料的類型(是html還是純文字還是多媒體檔案等)、大小、來源等信息(如果想要看一下這些信息,可以使用telnet工具(而不是透過瀏覽器)按照http協定自己發起get等請求試試)。由於頭部是優先於html發送的,作為html的一部分其優先級也低於頭部,如果在頭部中已經包含了有關網頁字符編碼的描述,瀏覽器最終就會依照頭部中所說明的字元編碼集來解析網頁。

在php中,可以使用header("content-type:text/html; charset=xxx"); 來傳送關於字元集的頭部。

而對於apache伺服器來說,它具有一個AddDefaultCharset的功能,也就是會為每個發送的網頁按照伺服器預設的字元集設定好對應頭部。

查看/etc/apache2/httpd.conf(2.4之前)或/etc/apache2/conf-available/charset.conf(2.4及以後),裡面有一句AddDefaultCharset xxx如果這句話未處於註解狀態,那麼為每個網頁新增預設字元集頭部的功能就處於開啟狀態,此時單獨設定標籤裡的字元集便沒有效果。

注意:html頁面所標示的編碼方式應該與實際在編寫html頁面(其實就是純文字)時保存所用的編碼方式一致。

一般而言,為了相容於中文甚至更多的其它語言,使用utf-8編碼方式是最省事的一種方式,因為utf-8幾乎支援世界上的所有常用語言。

mysql資料庫編碼:

在終端下mysql -uusername -ppassword 後進入mysql的控製程序,再鍵入show variables like 'character%'; (注意往mysql終端機中鍵入指令語句或sql語句時分號不可以省略)可以看到類似下圖:

上面列舉了mysql在各個層面上所使用的字元集,其中(*)

character-set-server/default-character-set:伺服器字元集,預設情況下所採用的。
character-set-database:資料庫字元集。
character-set-table:資料庫表格字元集。
優先依序增加。所以一般情況下只需要設定character-set-server,而在建立資料庫和表格時不特別指定字元集,這樣統一採用character-set-server字元集。
character-set-client:客戶端的字元集。客戶端預設字符集。當客戶端向伺服器發送請求時,請求以該字元集進行編碼。
character-set-results:結果字元集。伺服器向客戶端傳回結果或訊息時,結果以該字元集進行編碼。
在客戶端,如果沒有定義character-set-results,則採用character-set-client字元集作為預設的字元集。所以只需要設定character-set-client字元集。

所以我們會發現,上圖所示的character-set-server使用的不是utf8(註:在mysql中,utf-8編碼方式的表示為utf8,沒有「-」)。這是因為mysql預設的儲存方式在沒有修改的情況下就是latin1。在這種情況下,我們在使用mysql終端機進行建立資料庫和資料表的操作時,若在sql語句中沒有指定所使用字元集,那麼儲存時使用的編碼方式就會是latin1,明顯,中文存放在這種本來用來存放拉丁文的編碼方式下顯示出來肯定是亂碼。

那麼要怎麼修改它呢,可以使用set character-set-server = utf8;(由於character-set-server優先權高,只修改它即可達到修改資料庫儲存編碼方式的效果)。此後在終端機裡使用sql建表時表的儲存編碼方式即是utf-8。

但是,這個修改只對目前服務有效,使用quit;退出後再次進入mysql終端就會發現字元集又變回latin1了。想要讓修改永久生效的方法我目前找到的資料顯示只有透過重新編譯mysql時修改編譯參數達到,如果有高手知道怎麼不透過編譯實作煩請留言告知。

php編碼:

那麼,說到了mysql,php在和mysql進行互動時要怎麼保證傳輸資料過程中不出現亂碼呢?

依照(*)處的描述,實際上,為了使得存入mysql和從mysql中取出資料時不出現亂碼,我們只要使得以下三個系統參數設定為與伺服器字元集character-set -server相同的字元集。他們是:
character_set_client:客戶端的字元集。
character_set_results:結果字元集。
character_set_connection:連接字元集。
設定這三個系統參數可以透過向MySQL發送語句:set names xxx (xxx可以是utf8)來實現

#因此,當涉及從php往mysql發送中文等非英文字元時,在mysql_connect語句後使用mysql_query("set names utf8");語句(這裡假設資料庫儲存用的是utf8)後就可以放心傳送和取回中文了。

此外,由於html頁面實際上也可能由php動態生成,怎麼保證php動態生成的頁面所使用的編碼方式和頭部或裡聲明的一樣呢?

在php目錄下找到php.ini檔案修改default_charset = "utf-8「即可使得php在輸出頁面時使用utf-8來編碼。

推薦學習:《PHP影片教學

以上是php html頁面中文亂碼問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn