<?php php
//清除緩存 mysql
header("Pragma: no-cache"); sql
//設置過時時間 數據庫
header("Expires: 0"); 瀏覽器
header("Cache-Component: must-revalidate, post-check=0, pre-check=0"); 緩存
//設置下載的字符集 服務器
header("Content-type:application/octet-stream;charset=utf-8"); app
/** 函數
*因爲文件名UTF-8編碼的, 加上各個瀏覽器的差異,因此下載出來的文件名可能會出現亂碼 post
* **/
//檢查瀏覽頁面的訪問者在用什麼瀏覽器.
$ua = $_SERVER["HTTP_USER_AGENT"];
//對文件名以 URL 編碼
$filename =$this->file_name.".doc";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
/**
* filename後面的等號以前要加 *
filename的值用單引號分紅三段,分別是字符集(utf8)、語言(空)和urlencode過的文件名。
最好加上雙引號,不然文件名中空格後面的部分在Firefox中顯示不出來
注意urlencode的結果與php的urlencode函數結果不太相同,php的urlencode會把空格替換成+,而這裏須要替換成%20
通過試驗,發現幾種主流瀏覽器的支持狀況以下:
IE6 attachment; filename="<URL編碼以後的UTF-8文件名>"
FF3 attachment; filename="UTF-8文件名"
attachment; filename*="utf8''<URL編碼以後的UTF-8文件名>"
O9 attachment; filename="UTF-8文件名"
* **/
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8/'/'' . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
header("Content-Transfer-Encoding: binary");
readfile(getcwd().$this->file_path);
?>
一:引發中文亂碼的緣由
亂 碼的出現有2種緣由,首先是因爲編碼(charset) 設置錯誤,致使瀏覽器以錯誤的編碼來解析,從而出現了滿屏亂七八糟的「天書」,其次是文件被以錯 誤的編碼打開,而後保存,好比一個文本文件原先是 GB2312 編碼的,卻以UTF-8 編碼打開再保存。要解決上述亂碼問題,首先須要知道開發中哪些 環節涉及到了編碼:
一、文件編碼
二、頁面申明編碼
2、一些常見的錯誤狀況與解決:
一、 數據庫採用UTF8 編碼,而頁面申明編碼是GB2312 ,這是最多見的產生亂碼的緣由。這時候在PHP腳本里面直接SELECT數據出來的就是亂碼, 須要在查詢前先使用: mysql_query("SET NAMES GBK"); 來設定MYSQL鏈接編碼,保證頁面申明編碼與這裏設定的鏈接編碼 一致(GBK是GB2312的擴展 )。若是頁面是UTF-8 編碼的話,能夠用: mysql_query("SET NAMES UTF8"); 注 意是UTF8而不是通常用的UTF-8。假如頁面申明的編碼與數據庫內部編碼一致能夠不設定鏈接編碼。 注:事實上MYSQL的數據輸入輸出比上面講的更 複雜一些,MYSQL配置文件my.ini中定義了2個默認編碼,分別是[client]裏的 default -character-set和 [mysqld] 裏的default-character-set 來分別設定默認時候客戶端鏈接和數據庫內部所採用的編碼。咱們上面指定的編碼實際上是 MYSQL客戶端鏈接服務器時候的命令行參數 character_set_client,來告訴MYSQL服務器接受到的客戶端數據是什麼編碼的,而不 是採用默認編碼。
二、 頁面申明編碼與文件自己編碼不一致,這種狀況不多發生,由於若是編碼不一致美工作頁面時候在瀏覽器看到的就是亂碼了。更多時候是發佈之後修改一些 小 BUG,以錯誤編碼打開頁面而後保存致使的。或者是用某些FTP軟件直接在線修改文件,好比CuteFTP,因爲軟件編碼配置錯誤而致使轉換錯了編 碼。
三、 一些租用虛擬主機的朋友,明明上述3項編碼都設置正確了仍是有亂碼。比方說網頁是GB2312 編碼的,IE等瀏覽器打開卻老是識別成UTF-8 ,網頁 HEAD裏面已經申明是GB2312 了,手動修改瀏覽器編碼爲GB2312 後頁面顯示正常。產生緣由是服務器Apache設定了服務器全局的默認編 碼,在httpd.conf裏面加了AddDefaultCharset UTF-8 。這時候服務器會首先發送HTTP頭給瀏覽器,其優先級比頁面裏申 明編碼高,天然瀏覽器就識別錯了。解決辦法有2個,請管理員在配置文件本身的虛機里加上 一條AddDefaultCharset GB2312 來覆蓋 全局配置,或者在本身目錄的.htaccess裏配置。
總結:總之一句話,要解決php中文亂碼,必須保證編碼格式一致