亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PHP 中文亂碼解決辦法總結(jié)分析

 更新時(shí)間:2009年07月30日 01:19:43   作者:  
總之一句話,要解決PHP中文亂碼最好最快的解決辦法就是,頁面申明的編碼與數(shù)據(jù)庫內(nèi)部編碼一致,如果頁面申請(qǐng)的頁碼與數(shù)據(jù)庫內(nèi)部編碼不一致時(shí),就設(shè)定連接編碼,mysql_query(”SET NAMES XXX”); XXX為連接編碼.一定可以解決亂碼的問題.
一.首先是PHP網(wǎng)頁的編碼
1. php文件本身的編碼與網(wǎng)頁的編碼應(yīng)匹配
a. 如果欲使用gb2312編碼,那么php要輸出頭:header(“Content-Type: text/html; charset=gb2312″),靜態(tài)頁面添加<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>,所有文件的編碼格式為ANSI,可用記事本打開,另存為選擇編碼為ANSI,覆蓋源文件。
b. 如果欲使用utf-8編碼,那么php要輸出頭:header(“Content-Type: text/html; charset=utf-8″),靜態(tài)頁面添加<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>,所有文件的編碼格式為utf-8。保存為utf-8可能會(huì)有點(diǎn)麻煩,一般utf-8文件開頭會(huì)有BOM,如果使用session就會(huì)出問題,可用editplus來保存,在editplus中,工具->參數(shù)選擇->文件->UTF-8簽名,選擇總是刪除,再保存就可以去掉BOM信息了。
2. php本身不是Unicode的,所有substr之類的函數(shù)得改成mb_substr(需要裝mbstring擴(kuò)展);或者用iconv轉(zhuǎn)碼。
二.PHP與Mysql的數(shù)據(jù)交互
PHP與數(shù)據(jù)庫的編碼應(yīng)一致
1. 修改mysql配置文件my.ini或my.cnf,mysql最好用utf8編碼
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM
在[mysqld]下加入:
default-collation=utf8_bin
init_connect='SET NAMES utf8′
2. 在需要做數(shù)據(jù)庫操作的php程序前加mysql_query(”set names ‘編碼'”);,編碼和php編碼一致,如果php編碼是gb2312那mysql編碼就是gb2312,如果是utf-8那mysql編碼就是utf8,這樣插入或檢索數(shù)據(jù)時(shí)就不會(huì)出現(xiàn)亂碼了
三.PHP與操作系統(tǒng)相關(guān)
Windows和Linux的編碼是不一樣的,在Windows環(huán)境下,調(diào)用PHP的函數(shù)時(shí)參數(shù)如果是utf-8編碼會(huì)出現(xiàn)錯(cuò)誤,比如move_uploaded_file()、filesize()、readfile()等,這些函數(shù)在處理上傳、下載時(shí)經(jīng)常會(huì)用到,調(diào)用時(shí)可能會(huì)出現(xiàn)下面的錯(cuò)誤:
Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in …
Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move ” to ” in …
Warning: filesize() [function.filesize]: stat failed for … in …
Warning: readfile() [function.readfile]: failed to open stream: Invalid argument in ..
在Linux環(huán)境下用gb2312編碼雖然不會(huì)出現(xiàn)這些錯(cuò)誤,但保存后的文件名出現(xiàn)亂碼導(dǎo)致無法讀取文件,這時(shí)可先將參數(shù)轉(zhuǎn)換成操作系統(tǒng)識(shí)別的編碼,編碼轉(zhuǎn)換可用mb_convert_encoding(字符串,新編碼,原編碼)或iconv(原編碼,新編碼,字符串),這樣處理后保存的文件名就不會(huì)出現(xiàn)亂碼,也可以正常讀取文件,實(shí)現(xiàn)中文名稱文件的上傳、下載。
其實(shí)還有更好的解決方法,徹底與系統(tǒng)脫離,也就不用考慮系統(tǒng)是何編碼??梢陨梢粋€(gè)只有字母和數(shù)字的序列作為文件名,而將原來帶有中文的名字保存在數(shù)據(jù)庫中,這樣調(diào)用move_uploaded_file()就不會(huì)出現(xiàn)問題,下載的時(shí)候只需將文件名改為原來帶有中文的名字。實(shí)現(xiàn)下載的代碼如下
header(”Pragma: public”);
header(”Expires: 0″);
header(”Cache-Component: must-revalidate, post-check=0, pre-check=0″);
header(”Content-type: $file_type”);
header(”Content-Length: $file_size”);
header(”Content-Disposition: attachment; filename=\”$file_name\”");
header(”Content-Transfer-Encoding: binary”);
readfile($file_path);
$file_type是文件的類型,$file_name是原來的名字,$file_path是保存在服務(wù)上文件的地址。
四.再來總結(jié)一下為什么會(huì)亂碼
一般來說,亂碼的出現(xiàn)有2種原因,首先是由于編碼(charset)設(shè)置錯(cuò)誤,導(dǎo)致瀏覽器以錯(cuò)誤的編碼來解析,從而出現(xiàn)了滿屏亂七八糟的“天書”,其次是文件被以錯(cuò)誤的編碼打開,然后保存,比如一個(gè)文本文件原先是GB2312編碼的,卻以UTF-8編碼打開再保存。要解決上述亂碼問題,首先需要知道開發(fā)中哪些環(huán)節(jié)涉及到了編碼:
1、文件編碼:指的是頁面文件(.html,.php等)本身是以何種編碼來保存的。記事本和Dreamweaver 在打開頁面時(shí)候會(huì)自動(dòng)識(shí)別文件編碼因而不太會(huì)出問題。而ZendStudio卻不會(huì)自動(dòng)識(shí)別編碼,它只會(huì)根據(jù)首選項(xiàng)的配置固定以某種編碼打開文件,如果工作時(shí)候一不注意,用錯(cuò)誤編碼打開文件,做了修改之后一保存,亂碼就出現(xiàn)了(我深有體會(huì))。
2、頁面申明編碼:在HTML代碼HEAD里面,可以用<meta http-equiv=”Content-Type” content=”text/html; charset=”XXX” />來告訴瀏覽器網(wǎng)頁采用了什么編碼,目前中文網(wǎng)站開發(fā)中XXX主要用的是GB2312和UTF-8兩種編碼。
3、數(shù)據(jù)庫連接編碼:指的是進(jìn)行數(shù)據(jù)庫操作時(shí)候以哪種編碼與數(shù)據(jù)庫傳輸數(shù)據(jù),這里需要注意的是不要與數(shù)據(jù)庫本身的編碼混淆,比如MySQL內(nèi)部默認(rèn)是latin1編碼,也就是說Mysql是以latin1編碼來存儲(chǔ)數(shù)據(jù),以其他編碼傳輸給Mysql的數(shù)據(jù)會(huì)被轉(zhuǎn)換成latin1編碼。
知道了WEB開發(fā)中哪些地方涉及到了編碼,也就知道了亂碼產(chǎn)生的原因:上述3項(xiàng)編碼設(shè)置不一致,由于各種編碼絕大部分是兼容ASCII的,所以英文符號(hào)不會(huì)出現(xiàn),中文就倒霉了。
五.決戰(zhàn)一些常見的錯(cuò)誤情況與解決:
1、數(shù)據(jù)庫采用UTF8編碼,而頁面申明編碼是GB2312,這是最常見的產(chǎn)生亂碼的原因。這時(shí)候在PHP腳本里面直接SELECT數(shù)據(jù)出來的就是亂碼,需要在查詢前先使用: mysql_query(”SET NAMES GBK”); 來設(shè)定MYSQL連接編碼,保證頁面申明編碼與這里設(shè)定的連接編碼一致(GBK是GB2312的擴(kuò)展)。如果頁面是UTF-8編碼的話,可以用: mysql_query(”SET NAMES UTF8″);
注意是UTF8而不是一般用的UTF-8。假如頁面申明的編碼與數(shù)據(jù)庫內(nèi)部編碼一致可以不設(shè)定連接編碼。
注:事實(shí)上MYSQL的數(shù)據(jù)輸入輸出比上面講的更復(fù)雜一些,MYSQL配置文件my.ini中定義了2個(gè)默認(rèn)編碼,分別是[client]里的default -character-set和[mysqld]里的default-character-set來分別設(shè)定默認(rèn)時(shí)候客戶端連接和數(shù)據(jù)庫內(nèi)部所采用的編碼。我們上面指定的編碼其實(shí)是MYSQL客戶端連接服務(wù)器時(shí)候的命令行參數(shù)character_set_client,來告訴MYSQL服務(wù)器接受到的客戶端數(shù)據(jù)是什么編碼的,而不是采用默認(rèn)編碼。
2、頁面申明編碼與文件本身編碼不一致,這種情況很少發(fā)生,因?yàn)槿绻幋a不一致美工做頁面時(shí)候在瀏覽器看到的就是亂碼了。更多時(shí)候是發(fā)布以后修改一些小BUG,以錯(cuò)誤編碼打開頁面然后保存導(dǎo)致的。或者是用某些FTP軟件直接在線修改文件,比如CuteFTP,由于軟件編碼配置錯(cuò)誤而導(dǎo)致轉(zhuǎn)換錯(cuò)了編碼。
3、一些租用虛擬主機(jī)的朋友,明明上述3項(xiàng)編碼都設(shè)置正確了還是有亂碼。比方說網(wǎng)頁是GB2312編碼的,IE等瀏覽器打開卻總是識(shí)別成UTF-8,網(wǎng)頁HEAD里面已經(jīng)申明是GB2312了,手動(dòng)修改瀏覽器編碼為GB2312 后頁面顯示正常。產(chǎn)生原因是服務(wù)器Apache設(shè)定了服務(wù)器全局的默認(rèn)編碼,在httpd.conf里面加了AddDefaultCharset UTF-8。這時(shí)候服務(wù)器會(huì)首先發(fā)送HTTP頭給瀏覽器,其優(yōu)先級(jí)比頁面里申明編碼高,自然瀏覽器就識(shí)別錯(cuò)了。解決辦法有2個(gè),請(qǐng)管理員在配置文件自己的虛機(jī)里加上一條AddDefaultCharset GB2312來覆蓋全局配置,或者在自己目錄的.htaccess里配置。

總結(jié):總之一句話,要解決PHP中文亂碼最好最快的解決辦法就是,頁面申明的編碼與數(shù)據(jù)庫內(nèi)部編碼一致,如果頁面申請(qǐng)的頁碼與數(shù)據(jù)庫內(nèi)部編碼不一致時(shí),就設(shè)定連接編碼,mysql_query(”SET NAMES XXX”); XXX為連接編碼.一定可以解決亂碼的問題.

相關(guān)文章

  • 初步介紹PHP擴(kuò)展開發(fā)經(jīng)驗(yàn)分享

    初步介紹PHP擴(kuò)展開發(fā)經(jīng)驗(yàn)分享

    在PHP開發(fā)的過程中,有時(shí)候?yàn)榱颂岣咝阅?,需要選擇擴(kuò)展的方式去實(shí)現(xiàn),本文簡(jiǎn)單介紹怎么開發(fā)一個(gè)簡(jiǎn)單的PHP擴(kuò)展,解開PHP擴(kuò)展開發(fā)的神秘面紗
    2012-09-09
  • PHP中的session永不過期的解決思路及實(shí)現(xiàn)方法分享

    PHP中的session永不過期的解決思路及實(shí)現(xiàn)方法分享

    讓PHP的session永不過期,你可能沒有遇到這么郁悶的問題,但是我遇到過,很郁悶。
    2011-04-04
  • PHP容易忘記的知識(shí)點(diǎn)分享

    PHP容易忘記的知識(shí)點(diǎn)分享

    PHP容易忘記的知識(shí)點(diǎn)分享,使用php開發(fā)的朋友可以參考下
    2013-04-04
  • PHP反射API示例分享

    PHP反射API示例分享

    這篇文章主要為大家分享了PHP反射API示例,利用反射技術(shù)實(shí)現(xiàn)的插件系統(tǒng)架構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • php 實(shí)現(xiàn)進(jìn)制相互轉(zhuǎn)換

    php 實(shí)現(xiàn)進(jìn)制相互轉(zhuǎn)換

    最近的項(xiàng)目中需要用到進(jìn)制轉(zhuǎn)換,這個(gè)問題在剛剛接觸計(jì)算機(jī)理論時(shí)候,還是很會(huì)的,好久不用,居然模糊了……
    2016-04-04
  • php字符串截取問題

    php字符串截取問題

    我希望將一個(gè)字符串限長(zhǎng)顯示,如果該字符串超過一定長(zhǎng)數(shù),就截取前n個(gè)字符,后加省略號(hào)
    2006-11-11
  • php遍歷數(shù)組的方法分享

    php遍歷數(shù)組的方法分享

    php下最靈活的東西就是數(shù)組,很多數(shù)據(jù)都是通過數(shù)組的方式顯示,整理下數(shù)組的遍歷方法
    2012-03-03
  • PHP遍歷數(shù)組的三種方法及效率對(duì)比分析

    PHP遍歷數(shù)組的三種方法及效率對(duì)比分析

    這篇文章主要介紹了PHP遍歷數(shù)組的三種方法及效率對(duì)比,實(shí)例分析了foreach、while與for三種遍歷數(shù)組的方法與相關(guān)的效率比對(duì),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • php實(shí)現(xiàn)獲取農(nóng)歷(陰歷)、節(jié)日、節(jié)氣的類與用法示例

    php實(shí)現(xiàn)獲取農(nóng)歷(陰歷)、節(jié)日、節(jié)氣的類與用法示例

    這篇文章主要介紹了php實(shí)現(xiàn)獲取農(nóng)歷(陰歷)、節(jié)日、節(jié)氣的類與用法,結(jié)合實(shí)例形式分析了php日期工具類Lunar的具體定義與獲取農(nóng)歷日期、節(jié)氣等相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Ajax+PHP邊學(xué)邊練 之五 圖片處理

    Ajax+PHP邊學(xué)邊練 之五 圖片處理

    在上一篇中講解了如何通過Ajax提交表單并由PHP處理底層數(shù)據(jù),本篇將主要介紹圖片的上傳與處理。對(duì)于文件的上傳很簡(jiǎn)單,只需一個(gè)Form便可實(shí)現(xiàn),再通過PHP將源文件上傳到目標(biāo)目錄。
    2009-12-12

最新評(píng)論