php中文件的下載(以及下載的文件名中文亂碼)

<?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中文亂碼,必須保證編碼格式一致

相關文章
相關標籤/搜索