我們?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″ /> <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ǔ)言)。
總結(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è),,有可能不一致,。 |
|