久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PHP中文亂碼的三個(gè)原因及解決方法

 千秋鶴 2017-12-15

我們?cè)谧鯬HP項(xiàng)目的時(shí)候,,經(jīng)常會(huì)遇到中文亂碼的問(wèn)題,有時(shí)候編碼問(wèn)題還導(dǎo)致MYSQL的報(bào)錯(cuò),。中文亂碼總共有三個(gè)原因

1:APACHE服務(wù)器設(shè)置導(dǎo)致亂碼

2:PHP,,或者HTML頁(yè)面編碼導(dǎo)致中文亂碼

3:MYSQL數(shù)據(jù)庫(kù)的表以及字段編碼導(dǎo)致中文亂碼

我們分別從這三個(gè)部分來(lái)探究PHP程序設(shè)計(jì)中的編碼問(wèn)題

在這之前我們要了解一些基本理論:

1,、文件編碼

每個(gè)文件在保存的時(shí)候都可以選擇以什么編碼保存,例如用WINDOWS的記事本創(chuàng)建一個(gè)文件可以選擇ANSI 以及UTF8等等編碼,。我們選擇了什么編碼該文件就以這種編碼方式保存在硬盤(pán)上,。 讀取該文件數(shù)據(jù)的時(shí)候也會(huì)指定一種編碼來(lái)打開(kāi),如果指定的編碼與文件保存的時(shí)候的編碼不一樣的話就會(huì)出現(xiàn)亂碼

2,、HTML的編碼

在網(wǎng)頁(yè)頭部一般有這樣一個(gè)<HEAD>區(qū)域

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
這個(gè)的意思是讓客戶端知道,,接下來(lái)輸出的是html代碼(text/html),并且以下輸出的內(nèi)容都將是utf-8編碼的,。如果我們用記事本創(chuàng)建一個(gè)HTML文件 該文件包含

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

但是在保存的時(shí)候卻以ANSI編碼格式保存,,那么我們用瀏覽器打開(kāi)這個(gè)文件時(shí),瀏覽器看見(jiàn)META 行的UTF8編碼設(shè)置后 就將文件以UTF8格式輸出,,而文件本來(lái)是ANSI編碼,,這樣便出現(xiàn)了中文亂碼。

一:APACHE服務(wù)器編碼

在APACHE配置文件中有一行是編碼的設(shè)置 默認(rèn)的是AddDefaultCharset ISO-8859-1,,大部分人認(rèn)為應(yīng)該將這句改為 AddDefaultCharset UTF-8 ,。而蝸牛認(rèn)為這是誤人子弟。 這項(xiàng)配置是告訴APACHE服務(wù)器選用什么樣的編碼來(lái)輸出WEB頁(yè)面(這樣做會(huì)忽略,,HTML頁(yè)面中的頁(yè)面編碼的設(shè)置 EG:<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />),,如果我們建立一個(gè)GB2312的頁(yè)面就會(huì)出現(xiàn)中文亂碼 。所以最好的方法是將AddDefaultCharset ISO-8859-1這一項(xiàng)注釋掉 #AddDefaultCharset

二:PHP編碼問(wèn)題

php最終生成的是文本文件,,而他要從數(shù)據(jù)庫(kù)中取出文本數(shù)據(jù),,還要把文本數(shù)據(jù)寫(xiě)到數(shù)據(jù)庫(kù)中。由于MYSQL并不知道PHP發(fā)送給他的是什么編碼的數(shù)據(jù),,所以需要客戶端PHP告訴他存取的是什么編碼的數(shù)據(jù),。然后MYSQL會(huì)自動(dòng)將PHP傳送來(lái)的數(shù)據(jù)轉(zhuǎn)換成目標(biāo)編碼格式的數(shù)據(jù)。

比如: PHP要將 文本數(shù)據(jù)DATE 寫(xiě)入到數(shù)據(jù)庫(kù)字段field中,,PHP發(fā)送的是UTF-8編碼的數(shù)據(jù),,而DATE是以GB2312方式存儲(chǔ)的。這時(shí)候PHP通過(guò)設(shè)置告訴MYSQL 我發(fā)的是UTF-8格式,,MYSQL接到數(shù)據(jù)后 說(shuō):”我知道了,,來(lái)誰(shuí)專門(mén)負(fù)責(zé)將UTF-8轉(zhuǎn)換成GB2312“ 于是MYSQL中的一個(gè)專門(mén)負(fù)責(zé)此事的小兵跑來(lái) 把數(shù)據(jù)拿走經(jīng)過(guò)加工放到指定位置,如果PHP誤將UTF-8編碼的數(shù)據(jù) 當(dāng)作GB2312編碼 送給MYSQL的時(shí)候,,MYSQL會(huì)叫上次那個(gè)負(fù)責(zé)UTF-8—-GB2312的小兵來(lái)負(fù)責(zé),,而小兵不管三七二十一按同樣方法轉(zhuǎn)換存起來(lái),這就出現(xiàn)了錯(cuò)誤,,亂碼就產(chǎn)生了,。取數(shù)據(jù)的時(shí)候也一樣,PHP要告訴MYSQL要取出什么樣編碼的數(shù)據(jù)。

PHP通過(guò)character_set_client告訴MYSQL,,php存入數(shù)據(jù)庫(kù)的是什么編碼方式

PHP通過(guò)character_set_results告訴MYSQL,php需要取什么樣編碼的數(shù)據(jù)

PHP通過(guò)character_set_connection告訴MYSQL,PHP查詢中的文本,,使用什么編碼

就算上面的大家都注意了,,還有個(gè)問(wèn)題也可能導(dǎo)致亂碼。那就是PHP文件(生成的HTML頁(yè)面)本身的編碼問(wèn)題

如果MYSQL傳來(lái)的數(shù)據(jù) 編碼與PHP本身編碼不一致也會(huì)導(dǎo)致亂碼

三:MYSQL編碼問(wèn)題

Mysql目前支持多字符集,,并且,,支持在不同的字符集之間轉(zhuǎn)換(便于移植和支持多語(yǔ)言)。
Mysql可以設(shè)置服務(wù)器級(jí)字符集,、數(shù)據(jù)庫(kù)級(jí)字符集,、數(shù)據(jù)表級(jí)字符集、表列的字符集,,實(shí)際上,最終使用字符集的地方是存儲(chǔ)字符的列,,比如,,你設(shè)置 table1中col1列是字符類型,col1才用到了字符集,,如果table1表的col2列是int類型,,col2不使用字符集的概念。
服務(wù)器級(jí)字符集,、數(shù)據(jù)庫(kù)級(jí)字符集,、數(shù)據(jù)表級(jí)字符集都是為列的字符集做默認(rèn)選項(xiàng)的。
Mysql一定有一個(gè)字符集,,可以通過(guò)啟動(dòng)時(shí)加參數(shù)指定 ,,也可以編譯時(shí)指定,也可以在配置文件里指定,。Mysql服務(wù)器字符集,,只是做為數(shù)據(jù)庫(kù)級(jí)的默認(rèn)值。創(chuàng)建數(shù)據(jù)庫(kù)時(shí),,你可以指定字符集,,如果沒(méi)指定,就使用服務(wù)器的字符集,。同理,,創(chuàng)建表時(shí),你可以指定表級(jí)的字符集,,如果沒(méi)指定,,使用數(shù)據(jù)庫(kù)的字符集做為表的字符集。創(chuàng)建列時(shí),,你可以指定某列的字符集,,如果沒(méi)指定,就使用表的字符集,。
通常情況下,,您只需設(shè)置服務(wù)器級(jí)的字符集,,其它的數(shù)據(jù)庫(kù)級(jí),表級(jí),,以及列級(jí)的字符集,,都繼承自服務(wù)器級(jí)字符集。
由于UTF8是最廣的字符集,,所以,,一般情況下,我們?cè)O(shè)置Mysql服務(wù)器級(jí)的字符集為UTF8,!

 

總結(jié):

要保證不亂碼,,需將三個(gè)編碼統(tǒng)一:

一:是網(wǎng)頁(yè)自身的編碼

二:是HTML里指定的編碼

三:是PHP告訴Mysql的編碼(包括character_set_client和character_set_results)。

第一和第二個(gè)編碼,,如果使用DW之類的編輯器寫(xiě)的網(wǎng)頁(yè),,通常是一致的,但用記事本寫(xiě)的網(wǎng)頁(yè),,有可能不一致,。
第三個(gè)編碼,需要手工通知Mysql,。這步可以通過(guò)在PHP里使用mysql_query(“set names characterX”)來(lái)實(shí)現(xiàn),。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多