他設定了瀏覽器端採用gb2312的字符集,此時如果程式使用的是utf8的編碼(就是指以什麼樣的編碼來編寫的程式,一般在編輯器中設定),那麼就會產生亂碼。
此時的解決方法就是把charset的值改為utf8
2、**本身就存在亂碼問題
這種情況是指你的**本身就存在亂碼問題。照成這種情況的原因一般是你以另一種編碼格式修改了你的**後並做了儲存,這樣你的程式中就有幾種編碼形式的**,那麼輸出的時候自然就會有亂碼。這類問題相對來說比較容易解決,只要人工找到那段有亂碼的**,然後修改就行了(很多編輯器可以完成這個工作)。
3、mysql的問題(此次討論僅圍繞mysql5.0之後的版本展開)
現在再來看最容易照成亂碼,也是最容易讓人迷糊的mysql亂碼問題。
要說mysql亂碼,得先從mysql的幾個引數說起,從mysql5開始,多了幾個設定字符集的系統變數:
character_set_client 客戶端字符集
character_set_connection 客戶端與伺服器端連線採用的字符集
character_set_results select查詢返回資料的字符集
character_set_database 資料庫採用的字符集
亂碼問題一般是由於以上幾個變數設定錯誤照成的,很多人在請教亂碼問題的時候,一般都會得到乙個這樣的答案:「你先set names一下」。
那麼set names是什麼呢? set names實際上就是同時設定了character_set_client, character_set_connection, character_set_results這三個系統變數。
例如set names 'gbk'等同於:
set @@character_set_client = 'gbk'
set @@character_set_connection = 'gbk'
set @@character_set_results = 'gbk'
很多情況下,這樣設定了之後就能把亂碼問題解決了。但是還是不能完全避免出現亂碼的可能,為什麼呢?
因為character_set_client,character_set_connection這兩個變數僅用與保證與character_set_database編碼的一致,而character_set_results則用與保證select返回的結果與程式的編碼一致。
例如,你的資料庫(character_set_database)用的是utf8的字符集,那麼你就要保證character_set_client,character_set_connection也是utf8的字符集。而你的程式也許採用的並不是utf8,比如你的程式用的是gbk,那麼你若把character_set_results也設定為utf8的話就會出現亂碼問題。此時你應該把character_set_results設定為gbk。這樣就能保證資料庫返回的結果與你的程式的編碼一致。
下面我給出一段用於設定字符集的**(其中用到了乙個我自己寫的db庫,相信應該不影響閱讀):
<?
//假設我們的程式採用的是utf8的字符集
$program_char = 'utf8';
//先檢查mysql的版本號,如果版本號大於4我們才可以設定這些系統變數(mysql4還沒有這些系統變數)
$version = current($db->fetch_one('select version()'));
if (substr($version, 0, 1) > 4)
?>
到此應該就可以解決絕大多數我們遇到的亂碼問題了,另外還必須強調的是,有時候亂碼的出現有可能是以上幾種原因混合造成的。
對於這樣的問題處理起來就比較的麻煩。因為首先要保證你在資料庫中儲存的資料的字符集與資料庫的字符集是一致的。如果你在乙個utf8的資料庫中儲存了gbk字元資料(如果你頁面的編碼與資料庫的編碼不一致,那麼產生這個問題的可能性就很大),那麼假設以上的設定都正確,結果還是會出現亂碼的問題。不過這類問題一旦確定了產生的原因,那麼就還是有辦法解決的,比如剛才我舉的這個例子。
我們如果能確保其他環節的設定都是正確的,並且能夠確認是由於把gbk的資料存到了utf8的
資料庫中而造成的亂碼,那麼我就可以把這些資料從資料庫中取出來之後再用iconv()轉換編碼也是可以的。
總而言之,我們應當盡量的保證資料庫中的資料是正確的,那麼問題處理起來就相對簡單了。
說了一大堆可能把你給弄迷糊了,我將其總結為以下四點,便於大家記憶。
1、要保證資料庫中存的資料與資料庫編碼一致,即資料編碼與character_set_database一致;
2、要保證通訊的字符集與資料庫的字符集一致,即character_set_client, character_set_connection與character_set_database一致;
3、要保證select的返回與程式的編碼一致,即character_set_results與程式編碼一致;
4、要保證程式編碼與瀏覽器編碼一致,即程式編碼與一致。
PHP亂碼問題
其實mysql亂碼這已經是個老話題了,對於新手來說又是個很麻煩的問題。首先整個教程的 頁面使用的都是utf 8.資料庫校對為 utf8 general ci,在建資料庫時一定要選擇這個。然後是資料庫連線 上加發下 link mysql connect localhost root or die 資料...
php亂碼問題
在資料庫 設定utf 8的條件下的資料庫 首先純html頁要用meta標籤宣告編碼 有php輸出的頁要使用header函式宣告編碼 header content type text html charset gb2312 同時檔案也要另存為utf 8格式 gbk同理 這樣編碼算統一了 還要注意一點 ...
php 亂碼問題
統一編碼很重要 從寫入 html php mysql 再讀取返回時,也要注意!注意一 在php頭在 html 這個標籤。這樣是html頁面的要求 注意二 header content type text html charset utf 8 不過會報warning 不好用 注意三 mysql que...