PHP 的字符集編碼問題

2021-05-25 20:21:38 字數 2444 閱讀 2188

幾乎每個剛開始用 php 和 mysql 開發 web 應用的人,都受到過編碼問題的困擾。要麼頁面原始漢字和從資料庫裡取出的漢字全是亂碼;要麼原始漢字和資料庫漢字,乙個顯示正常了,另乙個就變成亂碼了。很煩很氣人!

問題需要一步一步的解決。在實際操作以下方法之前,需要配置 web 伺服器,使其與 php 整合,最終可以除錯 php 程式。我們以常見的 gb2312 和 utf-8 字符集為例來測試和說明。瀏覽器是 ie7.0。

一,頁面原始漢字亂碼的解決

1.1 開啟中文 windows,用 ultraedit 建立乙個文字檔案,手工輸入乙個 php 頁面檔案,檔案內容如下。儲存為 test1.php 檔案,注意儲存時「格式」下拉框選擇「預設」- 特別注意這裡。

電腦學習網:

用 ie 瀏覽器開啟**的這一頁面。可以看到,頁面顯示正常。在 ie 瀏覽器的「檢視」/「編碼」選單下看到(勾選了「自動選擇」),字元編碼是 gb2312。

[firefox 2.0 下顯示正常。]

1.2 然後,在 ultraedit 的「檔案」選單下,選「另存為」,格式選擇「utf-8」,檔名為 test2.php。用 ie 瀏覽器開啟這一頁面。可以看到,頁面顯示正常(其實英文本型已經有略微的變化了)。在 ie 瀏覽器的「檢視」/「編碼」選單下看到(勾選了「自動選擇」),字元編碼是 utf-8,自動變了!注意 一句並沒有修改,但是瀏覽器卻自動辨別出了真實的字符集編碼!看來 ie 還是比較聰明的,也說明 ie 自動判別字符集是比 mete 標籤中 charset=*** 的定義優先的。

[firefox 2.0 下顯示出現亂碼。]

1.3 在該頁面首部加語句

<?php

header("content-type:text/html;charset=utf-8");

?>

再次儲存該頁面檔案,「格式」下拉框選擇「預設」,檔名為 test3.php。用 ie 開啟**裡的該檔案,這次看到,除過英文本母,漢字變成亂碼了!同時在 ie 瀏覽器的「檢視」/「編碼」選單下看到(勾選了「自動選擇」),字元編碼是 utf-8,已經被強制改變了。

出現漢字亂碼的原因,是因為原本的 gb2312 編碼,被強制以 utf-8 的編碼形式顯示,所以亂碼出現了。這個時候在瀏覽器裡人為指定 gb2312 編碼,頁面漢字又顯示正常了(真正製作頁面時是不能這麼做的,非要讓瀏覽者自己選擇編碼,乙個是瀏覽者可能根本不知道怎麼選擇編碼、選什麼編碼,再者也顯得我們太菜了!)。

[firefox 2.0 下顯示出現亂碼。]

1.4 在該頁面首部加語句

<?php

header("content-type:text/html;charset=gb2312");

?>

再次儲存該頁面檔案,「格式」下拉框選擇「utf-8」,檔名為 test4.php。用 ie 開啟**裡的該檔案,奇怪:看到頁面漢字顯示正常,並不是預想到的亂碼?!在 ie 瀏覽器的「檢視」/「編碼」選單下看到(勾選了「自動選擇」),字元編碼仍然是 utf-8,並沒有被強制改變了 gb2312 字符集。

這個時候在瀏覽器裡人為指定 gb2312 編碼,發現 ie 瀏覽器並不能人為指定編碼。看來 ie 瀏覽器對 utf-8 字符集特別關照。無論是在 meta 標籤指定,還是 php 語句指定,都不能讓 ie 瀏覽器顯示出漢字亂碼。

[firefox 2.0 下顯示出現亂碼。]

小結一下: 以上測試主要在 ie7.0 下進行,web 伺服器為 windows server 2003 下的 iis6.0,php 版本為 4.4.7。可以看到,ie7.0 為了正確識別字符集做了很多額外的自動處理的工作,以顯示其智慧型和友好。有時太殷勤了反而使我們不知所措。由於漢字亂碼問題與不同的瀏覽器及其不同的版本、web 伺服器、後台指令碼和不同的字符集都有點關係,所以問題顯得特別複雜。作為 web 程式設計人員,主要關心與自己有關的因素就可以了,沒必要成為字符集編碼方面的專家。為了相容目前流行的 ie 和 ff 瀏覽器,我們可以按照以下簡單的方法處理我們的 php **:

1,頁面的真正字符集與 meta 標籤指定的應該一致;

2,也可以使用 header("content-type:text/html;charset=***"); 語句指定字符集,但是不能與字元的真正字符集衝突,也不能與 meta 標籤衝突。(儘管根據測試結果表明,當 header() 和 meta 衝突時,header() 比 meta 指定的字符集更優先,因為根據 httpwatch basic 跟蹤顯示,header() 指定字符集後,ie 瀏覽器 type 會明確的得到字符集指定。但是不能保證其它非主流瀏覽器也會這樣。)

3,不能與資料庫取回的字元的字符集衝突,否則頁面會出現頁面本身的漢字和資料庫取回的漢字,全部亂碼或部分亂碼問題。

二,資料庫亂碼的解決及其與頁面字符集的配合

mysql 5.0 在安裝完畢後,可以進入配置嚮導,對一些引數進行設定。其中就有配置伺服器預設字符集選項。這裡需要選擇定製配置,指定一種我們常用的字符集,可以選擇支援多位元組編碼的 utf8 或 gb2312。因為據說其預設的 latin1 字符集不支援漢字,因為不支援多位元組編碼。

PHP 字符集編碼問題

幾乎每個剛開始用 php 和 mysql 開發 web 應用的人,都受到過編碼問題的困擾。要麼頁面原始漢字和從資料庫裡取出的漢字全是亂碼 要麼原始漢字和資料庫漢字,乙個顯示正常了,另乙個就變成亂碼了。很煩很氣人!問題需要一步一步的解決。在實際操作以下方法之前,需要配置 web 伺服器,使其與 php...

PHP字符集問題

1.mytable1儲存的資料是utf8字符集 在建立表的時候,指定了表的資料儲存字符集為utf8 2.cmd控制台只能是gbk格式的資料 說明cmd下只能輸入和顯示gbk格式的資料 3.set names gbk的功能 客戶端與服務端進行不同編碼的通訊的原理 了解資料庫的字符集 檢視資料庫支援哪些...

MySQL字符集編碼問題

今天專案中,用中斷命令匯入sql指令碼,發現其報出編碼錯誤,後來進過一番分析查詢後,發現字符集utf8mb4在mysql 5.5.3之後才支援,頓時無語,隨後改字符集編碼為utf8。注意 查詢mysql版本命令 mysql v mysql命令 1 使用show語句找出在伺服器上當前存在什麼資料庫 m...