1. 程式人生 > >終結PHP中文亂碼的問題

終結PHP中文亂碼的問題

亂碼總是出現在utf-8和gb2312(或者是gbk)糾纏不清的時候,因此,保證php網頁不亂碼的一個前提是php檔案與靜態網頁的編碼要一致

1.使用utf-8編碼的時候,php檔案在所有輸出之前加上:
header("Content-Type: text/html; charset=utf-8");
靜態頁面新增:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">。
所有檔案的編碼格式為utf-8。儲存為utf-8可能會有點麻煩,類似WINDOWS自帶的記事本等軟體,在儲存一個以UTF-8編碼的檔案時,會在檔案開始的地方插入三個不可見的字元(0xEF 0xBB 0xBF,即BOM——Byte Order Mark)。它是一串隱藏的字元,用於讓記事本等編輯器識別這個檔案是否以UTF-8編碼。對於一般的檔案,這樣並不會產生什麼麻煩。

但對於 PHP來說,PHP在設計時就沒有考慮BOM的問題,不會忽略UTF-8編碼的檔案開頭 BOM的那三個字元,會把BOM作為該檔案開頭正文的一部分。由於必須在<?或者<?php後面的程式碼才會作為PHP程式碼執行,所以將會造成在頁面上輸出這三個字元,顯示效果就要看瀏覽器了,一般是一個空行或是一個亂碼。由於受COOKIE送出機制的限制,在這些檔案開頭已經有BOM的檔案中,COOKIE無法送出(因為在 COOKIE送出前PHP已經送出了檔案頭),所以登入和登出功能失效。一切依賴COOKIE、SESSION實現的功能全部無效。
可用EmEditor來儲存,在EmEditor中,另存為->去掉unicode簽名(BOM)前的勾,再儲存就可以去掉BOM資訊了。

2.使用gb2312編碼,php檔案在所有輸出之前加上:
header(“Content-Type: text/html; charset=gb2312"),
頁面新增
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
所有檔案的編碼格式為ANSI。

二.PHP與資料庫的編碼應一致
以Mysql資料庫為例,在需要做資料庫操作的php程式前加mysql_query("set names 'xx'");,如果php編碼是gb2312那xx就是gb2312,如果是utf-8那xx就是 utf8(是utf8 而不是utf-8

),這樣操作資料時就不會出現亂碼了。

另外mysql最好用utf8編碼,修改mysql配置檔案 my.ini或my.cnf

[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM

在 [mysqld]下加入:
default-collation=utf8_bin
init_connect='SET NAMES utf8'