1. 程式人生 > >Linux下中文檔名亂碼問題的詳解

Linux下中文檔名亂碼問題的詳解

最近做的專案中,涉及Linux下生成中文檔名並壓縮打包下載亂碼問題,需要將生成的壓縮包檔案自定義重新命名(包括中文),問題來了,Linux下不支援中文的,所以會導致中文亂碼問題,網上找了幾天,都沒解決,現在終於給碼出來了,希望大家指出缺點。

首先,讓linux支援中文,就是在/usr/lib/locale的預設中,新增以下三句,或者註釋掉這三句前的#

zh_CN.GBK GBK
zh_CN.GB18030 GB18030
zh_CN.UTF-8 UTF-8

其次,由於下載的檔案會把目錄整個顯示,之前轉載別人的文章,
使用了pathinfo函式去獲取他的basename,就避免了目錄結構被暴露,
原來,文字編碼中windows預設是GBK,而Linux預設是UTF-8,
這樣就導致輸出的是亂碼,亂碼的文字被自動忽略。
所以我重新寫了一個pathinfo函式 path_info() 。

分享自己的code:

if($action == "downreport"){
    if(substr($report_ids,-1)==","){
        $report_ids = substr($report_ids,0,-1);
    }
    $report_id = $report_ids;
if($report_id == '0'){
die("{success:false,msg:'error',code:'e8000'}");
}
    if(strpos($report_id,',')){
        $arrids = explode(',',$report_id
); $newids = array(); foreach($arrids as $id){ $newids []= intval($id); } $ids = implodeids($newids); $reports = array(); $reports_name = array(); $paths = array(); $query = $db->query("select `name`,filename from report_list where id in ($ids)"
); while($report = $db->fetch_array($query)){ $reports[]= $report['filename']; $reports_name[]= $report['name']; } for($i = 0; $i < count($reports); $i++ ){ $j = 1; $temp_fileName = $reports_name[$i]."_"; while(file_exists(ESHINE_ROOT."tmp/temp/".$reports_name[$i] .".zip")){ $reports_name[$i] = $temp_fileName.$j; $j++; } //$reports_name[$i] = $temp_fileName; copy(ESHINE_ROOT."Report/".$reports[$i].".zip",ESHINE_ROOT."tmp/temp/".$reports_name[$i].".zip"); $paths[$i] = ESHINE_ROOT."tmp/temp/".$reports_name[$i].".zip"; } //重寫pathinfo函式,解決中文被置空 2014.11.26 function path_info($filepath) { $path_parts = array(); $path_parts ['dirname'] = rtrim(substr($filepath, 0, strrpos($filepath, '/')),"/")."/"; $path_parts ['basename'] = ltrim(substr($filepath, strrpos($filepath, '/')),"/"); $path_parts ['extension'] = substr(strrchr($filepath, '.'), 1); $path_parts ['filename'] = ltrim(substr($path_parts ['basename'], 0, strrpos($path_parts ['basename'], '.')),"/"); return $path_parts; } //建立壓縮包 2014.11.24 function create_zip($files=array(),$destination='',$overwrite=false){ //if the zip file already exists and overwrite is false, return false //如果zip檔案已經存在並且設定為不重寫返回false if(file_exists($destination) && !$overwrite){ return false; } $valid_files=array(); //獲取到真實有效的檔名 if(is_array($files)){ //cycle through each file foreach($files as $file){ //make sure the file exists if(file_exists($file)){ $valid_files[]=$file; } } } //如果存在真實有效的檔案 if(count($valid_files)){ //create the archive $zip = new ZipArchive(); //開啟檔案 如果檔案已經存在則覆蓋,如果沒有則建立 if($zip->open($destination,$overwrite?ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE)!==true){ return false; } //向壓縮檔案add the files foreach($valid_files as $file){ //$zip->addFile($file,$file); //$file_info_arr= pathinfo($file); $file_info_arr = path_info($file); $filename = $file_info_arr['basename']; $filename = iconv('UTF-8', 'GBK//IGNORE', $filename); //die($filename); $zip->addFile($file,$filename); } $zip->close(); //check to make sure the file exists //檢測檔案是否存在 return file_exists($destination); }else{ return false; } } if(create_zip($paths,ESHINE_ROOT."tmp/temp/".$tempFileName.".zip",true)){ $newfiles = ESHINE_ROOT."tmp/temp/".$tempFileName.".zip"; } //sleep(1); $tempFileName = date("YmdHis",time()).mt_rand(1000, 9999); for($i = 0; $i < count($paths); $i++ ){ @unlink($paths[$i]); } if(!$newfiles){ echo 'Not Found' . $newfiles; exit; }else{ header("Content-type: application/octet-stream"); //header("Content-type: application/force-download"); header("Accept-Ranges: bytes"); header("Accept-Length: ".filesize($newfiles)); header("Content-Disposition: attachment; filename=".$tempFileName.".zip"); //header('Content-Type: application/octet-stream; name=' . $out_filename); touch($newfiles); $file = fopen($newfiles, "r"); //echo fread($file, filesize($newfiles)); $buffer = 1024; // //判斷檔案是否讀完 while (!feof($file)) { //將檔案讀入記憶體 $file_data = fread($file, $buffer); //每次向客戶端回送1024個位元組的資料 echo $file_data; } fclose($file); unlink($newfiles); writelog($msg_download_log_reportlist.$newfiles); } } }

相關推薦

Linux中文檔名亂碼問題的

最近做的專案中,涉及Linux下生成中文檔名並壓縮打包下載亂碼問題,需要將生成的壓縮包檔案自定義重新命名(包括中文),問題來了,Linux下不支援中文的,所以會導致中文亂碼問題,網上找了幾天,都沒解決,現在終於給碼出來了,希望大家指出缺點。 首先,讓linux

Linux hosts文件

domain none oca 不同 詳解 als 機器 區別 int Linux 下hosts文件詳解 主機名: 無論在局域網還是INTERNET上,每臺主機都有一個IP地址,是為了區分此臺主機和彼臺主機,也就是說IP地址就是主機的門牌號。 公網:IP地

【轉載】linux的mount命令

文件的 flag 自動加載 網絡文件系統 解決問題 選項 lock home 多個參數 以下內容來自:http://blog.csdn.net/clozxy/article/details/5299054 http://linux.chinaunix.net/techdo

Linux使用Corosync+Pacemaker及安裝

corosync pacemaker 珠聯璧合 Corosync詳解OpenAIS概述OpenAIS是基於SA Forum 標準的集群框架的應用程序接口規範。OpenAIS提供一種集群模式,這個模式包括集群框架,集群成員管理,通信方式,集群監測等,能夠為集群軟件或工具提供滿足 AIS標準的集

Linuxinittab文件

tle sso 根據 UC number mage failure 並且 命令行模式 /etc/inittab文件詳解 Linux系統的啟動過程為:加電自檢-->根據BIOS中的設置從指定的設備啟動-->找到設備MBR中的bootloader引導啟動系統--&

linux路由設置

RoCE ive sys 路由route 寫入文件 路由表 ado per 數據 路由表信息解釋 ##名詞解釋:Active Routes:活動的路由Network destination :目的網段Netmask:子網掩碼Gateway:網關,又稱下一跳路由器。在發送

Linux套接字---epoll模式的IO多路複用伺服器

1 epoll模型簡介 epoll可是當前在Linux下開發大規模併發網路程式的熱門人選,epoll 在Linux2.6核心中正式引入,和select相似,其實都I/O多路複用技術而已,並沒有什麼神祕的。 其實在Linux下設計併發網路程式,向來不缺少方法,比如典型的Apache模型(Proce

Linuxclock gettime函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux 的連結檔案

轉載來自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 轉載來自:(這個哥們加工了的,各種顏色,美化)http://www.cnblogs.com/li-hao/p/4107964.html

【轉載】Linux安裝軟體命令

【轉載日期】2018.09.11 【轉載標題】Linux下安裝軟體命令詳解 ----------------------------------------------------------------------------------------------

linuxopensll加解密

1、使用tar對檔案壓縮加密: 在當前目錄下有一個pma目錄的資料夾: tar -zcvf - pma|openssl des3 -salt -k password | dd of=pma.des3 完成將得到一個pma.des3的打包檔案,用你設定的密碼替換password。 2、使用ta

LinuxMongoDB 安裝配置

1.MongoDB簡單說明   a MongoDB是由C++語言編寫的一個基於分散式檔案儲存的開源資料庫系統,它的目的在於為WEB應用提供可擴充套件的高效能資料儲存解決方案。   b MongoDB是一個介於關係型資料庫和非關係型資料庫之間的產品,是非關係型資料庫當中功能

(筆記)Linux的ioctl()函式

我這裡說的ioctl函式是指驅動程式裡的,因為我不知道還有沒有別的場合用到了它,所以就規定了我們討論的範圍。寫這篇文章是因為我前一陣子被ioctl給搞混了,這幾天才弄明白它,於是在這裡清理一下頭腦。 一、 什麼是ioctl      ioctl是裝置驅動程

linux配置yum源

本人使用的方法一,成功配置,方法二沒測過,可以作為參考 方法一: 1.確保RHEL5中已經安裝了yum [[email protected] ~]# rpm -qa |grep yum yum-metadata-parser-1.1.2-3.el5 yum-up

linux的tar命令

通過SSH訪問伺服器,難免會要用到壓縮,解壓縮,打包,解包等,這時候tar命令就是是必不可少的一個功能強大的工具。linux中最流行的tar是麻雀雖小,五臟俱全,功能強大。 tar命令可以為linux的檔案和目錄建立檔案。利用tar,可以為某一特定檔案建立檔案(備份檔案),也可以在檔案中改變檔案,或者向檔案

Tomact8部署在linux啟動很慢

轉載老大的部落格~我們當時遇到的實際問題解決辦法,作為一個記錄 ————————————————————分割線—————————————————— Tomcat 8熵池阻塞變慢詳解 Tomcat 8啟動很慢,且日誌上無任何錯誤,在日誌中檢視到如下資訊: Log4j:[2015-10-29 15:4

【轉發】centos 7開啟FTP以及新增使用者配置許可權,只允許訪問自身目錄,不能跳轉根目錄 linuxftp配置檔案

1.切換到root使用者 2.檢視是否安裝vsftp,我這個是已經安裝的。 [[email protected] vsftpd]# rpm -qa |grep vsftpd vsftpd-3.0.2-11.el7_2.x86_64 3.如果沒有發現,則安裝。 yum ins

Linux原始碼編譯安裝

前言 原始碼要執行,必須先轉成二進位制的機器碼。這是編譯器的任務。 比如,下面這段原始碼(假定檔名叫做test.c)。 #include <stdio.h> int main(void) {   fputs("Hello, world!\n", stdout

Linux套接字(十)---epoll模式的IO多路複用伺服器

1 epoll模型簡介 epoll可是當前在Linux下開發大規模併發網路程式的熱門人選,epoll 在Linux2.6核心中正式引入,和select相似,其實都I/O多路複用技術而已,並沒有什麼神祕的。 其實在Linux下設計併發網路程式,向來不缺少

day77_淘淘商城專案_10_ Linux的Nginx代理(配置虛擬主機+實現反向代理+實現負載均衡+高可用) + 單點登入系統工程搭建 + SSO系統介面文件講解_匠心筆記

淘淘商城專案_10 1、目前訪問系統使用的方式存在的問題 2、什麼是nginx 3、nginx的應用場景 4、nginx的安裝 4.1、要求的安裝環境 4.2、安裝步驟 4.3、啟動nginx