溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php html頁(yè)面中文亂碼如何解決

發(fā)布時(shí)間:2023-01-31 11:32:19 來(lái)源:億速云 閱讀:145 作者:iii 欄目:編程語(yǔ)言

本文小編為大家詳細(xì)介紹“php html頁(yè)面中文亂碼如何解決”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“php html頁(yè)面中文亂碼如何解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

php html頁(yè)面中文亂碼問(wèn)題的解決辦法:1、在前端通過(guò)“”設(shè)置整個(gè)頁(yè)面的字符編碼;2、在php中通過(guò)“header("content-type:text/html; charset=xxx");”設(shè)置字符即可。

前端網(wǎng)頁(yè)、php與mysql數(shù)據(jù)庫(kù)字符編碼(解決中文等亂碼問(wèn)題

web開(kāi)發(fā)中經(jīng)常涉及前端網(wǎng)頁(yè)——php——mysql之間的數(shù)據(jù)交互,當(dāng)數(shù)據(jù)只有英文時(shí)通常不會(huì)有什么問(wèn)題,但一旦涉及中文,三個(gè)地方的某一處字符編碼不一致(如,網(wǎng)頁(yè)使用的時(shí)gbk而mysql使用utf-8)就有可能導(dǎo)致亂碼的出現(xiàn)。

前端網(wǎng)頁(yè)編碼:

通常我們都認(rèn)為可以通過(guò)<head>標(biāo)簽內(nèi)的<meta>項(xiàng)(如<META http-equiv="content-type" content="text/html; charset=xxx">)來(lái)設(shè)置整個(gè)頁(yè)面的字符編碼。大部分頁(yè)面可以采用這種方式來(lái)告訴瀏覽器顯示這個(gè)頁(yè)面的時(shí)候采用什么編碼,但是有的時(shí)候我們會(huì)發(fā)現(xiàn)有了這句還是不行,不管xxx是哪一種,瀏覽器采用的始終都是一種編碼。

這種情況涉及到http協(xié)議通信中的頭部(header)部分,實(shí)際上,用戶瀏覽網(wǎng)頁(yè)時(shí),服務(wù)器發(fā)送給用戶的內(nèi)容不僅包括我們的網(wǎng)頁(yè)(包括html/css/js這些代碼內(nèi)容),還包括被稱為頭部(header)的描述性內(nèi)容,這些內(nèi)容會(huì)告知客戶端將要接收的數(shù)據(jù)的類型(是html還是純文本還是多媒體文件等)、大小、來(lái)源等信息(如果想要看一下這些信息,可以使用telnet工具(而不是通過(guò)瀏覽器)按照http協(xié)議自己發(fā)起get等請(qǐng)求試試)。由于頭部是優(yōu)先于html發(fā)送的,<meta>作為html的一部分其優(yōu)先級(jí)也低于頭部,如果在頭部中已經(jīng)包含了有關(guān)網(wǎng)頁(yè)字符編碼的描述,瀏覽器最終就會(huì)按頭部中說(shuō)明的字符編碼集來(lái)解析網(wǎng)頁(yè)。

在php中,可以使用 header("content-type:text/html; charset=xxx"); 來(lái)發(fā)送關(guān)于字符集的頭部。

而對(duì)于apache服務(wù)器來(lái)說(shuō),它具有一個(gè)AddDefaultCharset的功能,也就是會(huì)為每個(gè)發(fā)送的網(wǎng)頁(yè)按照服務(wù)器默認(rèn)的字符集設(shè)定好對(duì)應(yīng)頭部。

查看/etc/apache2/httpd.conf(2.4之前)或/etc/apache2/conf-available/charset.conf(2.4及以后),里面有一句AddDefaultCharset xxx如果這一句未處于注釋狀態(tài),那么為每個(gè)網(wǎng)頁(yè)添加默認(rèn)字符集頭部的功能就處于開(kāi)啟狀態(tài),此時(shí)單獨(dú)設(shè)置<meta>標(biāo)簽里的字符集便沒(méi)有效果。

注意:html頁(yè)面所標(biāo)明的編碼方式應(yīng)該與實(shí)際在編寫html頁(yè)面(其實(shí)就是純文本)時(shí)保存所用的編碼方式一致。

一般而言,為了兼容中文甚至更多的其它語(yǔ)言,使用utf-8編碼方式是最省事的一種方式,因?yàn)閡tf-8幾乎支持世界上的所有常用語(yǔ)言。

mysql數(shù)據(jù)庫(kù)編碼:

在終端下mysql -uusername -ppassword 后進(jìn)入mysql的控制程序,再鍵入show variables like 'character%'; (注意往mysql終端中鍵入命令語(yǔ)句或sql語(yǔ)句時(shí)分號(hào)不可以省略)可以看到類似下圖:

php html頁(yè)面中文亂碼如何解決

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

character-set-server/default-character-set:服務(wù)器字符集,默認(rèn)情況下所采用的。
character-set-database:數(shù)據(jù)庫(kù)字符集。
character-set-table:數(shù)據(jù)庫(kù)表字符集。
優(yōu)先級(jí)依次增加。所以一般情況下只需要設(shè)置character-set-server,而在創(chuàng)建數(shù)據(jù)庫(kù)和表時(shí)不特別指定字符集,這樣統(tǒng)一采用character-set-server字符集。
character-set-client:客戶端的字符集??蛻舳四J(rèn)字符集。當(dāng)客戶端向服務(wù)器發(fā)送請(qǐng)求時(shí),請(qǐng)求以該字符集進(jìn)行編碼。
character-set-results:結(jié)果字符集。服務(wù)器向客戶端返回結(jié)果或者信息時(shí),結(jié)果以該字符集進(jìn)行編碼。
在客戶端,如果沒(méi)有定義character-set-results,則采用character-set-client字符集作為默認(rèn)的字符集。所以只需要設(shè)置character-set-client字符集。

于是我們會(huì)發(fā)現(xiàn),上圖所示的character-set-server使用的不是utf8(注:在mysql中,utf-8編碼方式的表示為utf8,沒(méi)有“-”)。這是因?yàn)閙ysql默認(rèn)的存儲(chǔ)方式在沒(méi)有修改的情況下就是latin1。在這種情況下,我們?cè)谑褂胢ysql終端進(jìn)行創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表的操作時(shí),若在sql語(yǔ)句中沒(méi)有指定所使用字符集,那么存儲(chǔ)時(shí)使用的編碼方式就會(huì)是latin1,明顯,中文存放在這種本來(lái)用于存放拉丁文的編碼方式下顯示出來(lái)肯定是亂碼。

那么怎么修改它呢,可以使用set character-set-server = utf8;(由于character-set-server優(yōu)先級(jí)高,只修改它即可達(dá)到修改數(shù)據(jù)庫(kù)存儲(chǔ)編碼方式的效果)。此后在終端里使用sql建表時(shí)表的存儲(chǔ)編碼方式即是utf-8。

但是,這個(gè)修改只對(duì)當(dāng)前服務(wù)有效,使用quit;退出后再次進(jìn)入mysql終端就會(huì)發(fā)現(xiàn)字符集又變回了latin1了。想要使修改永久生效的方法我目前找到的資料顯示只有通過(guò)重新編譯mysql時(shí)修改編譯參數(shù)達(dá)到,如果有高手知道怎么不通過(guò)編譯實(shí)現(xiàn)煩請(qǐng)留言告知。

php編碼:

那么,說(shuō)到了mysql,php在和mysql進(jìn)行交互時(shí)要怎么保證傳輸數(shù)據(jù)過(guò)程中不出現(xiàn)亂碼呢?

按照(*)處的描述,實(shí)際上,為了使得存入mysql和從mysql中取出數(shù)據(jù)時(shí)不出現(xiàn)亂碼,我們只要使得以下三個(gè)系統(tǒng)參數(shù)設(shè)置為與服務(wù)器字符集character-set-server相同的字符集。 他們是:
character_set_client:客戶端的字符集。
character_set_results:結(jié)果字符集。
character_set_connection:連接字符集。
設(shè)置這三個(gè)系統(tǒng)參數(shù)可以通過(guò)向MySQL發(fā)送語(yǔ)句:set names xxx (xxx可以是utf8)來(lái)實(shí)現(xiàn)

因此,當(dāng)涉及從php往mysql發(fā)送中文等非英文字符時(shí),在mysql_connect語(yǔ)句后使用mysql_query("set names utf8");語(yǔ)句(這里假設(shè)數(shù)據(jù)庫(kù)存儲(chǔ)用的是utf8)后就可以放心傳送和取回中文了。

此外,由于html頁(yè)面實(shí)際上也可能由php動(dòng)態(tài)生成,怎么保證php動(dòng)態(tài)生成的頁(yè)面所使用的編碼方式和頭部或<meta>里聲明的一樣呢?

在php目錄下找到php.ini文件修改default_charset = "utf-8“即可使得php在輸出頁(yè)面時(shí)使用utf-8來(lái)編碼。

讀到這里,這篇“php html頁(yè)面中文亂碼如何解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI