日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php zip 编码,encoding - 用PHP如何检测一个ZIP包内的文件是在何种编码的系统下创建的...

發布時間:2023/12/18 php 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php zip 编码,encoding - 用PHP如何检测一个ZIP包内的文件是在何种编码的系统下创建的... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

事情起源于在WIN下創建的zip放到linux下解壓時,中文路徑和文件名會出現亂碼,于是動手寫了個腳本轉換zip內文件名的代碼。但是,如果是在日語、韓語或者繁體字WIN系統下建立的zip,由于不知道原始編碼格式,導致無法轉碼。

怎么解。。。

回復內容:

事情起源于在WIN下創建的zip放到linux下解壓時,中文路徑和文件名會出現亂碼,于是動手寫了個腳本轉換zip內文件名的代碼。但是,如果是在日語、韓語或者繁體字WIN系統下建立的zip,由于不知道原始編碼格式,導致無法轉碼。

怎么解。。。

LZ 的 id 看著眼熟 ... 這么多年了還在問這個等級的問題 ... 你也不容易啊你 ...open( '/path/to/your.zip' );

/* can not open ..? are you kidding me ..? */

if ( true !== $res )

throw new Exception( 'Can Not Open Zip File / ' . $res );

/* default value of file encoding ... */

$encoding = 'EMTPY';

/* controller ... change this if mb_detect_encoding return wrong answer ... */

$controller = null;

/* get file list ... */

for ( $i = 0; $i < $zip->numFiles; ++ $i ) {

/* get file encoding ... */

$encoding = mb_detect_encoding( $zip->getNameIndex( $i ), $controller );

/* we do not need english named files ... */

if ( 'ASCII' !== $encoding ) break;

}

/* clean table ... */

$zip->close();

/* simply output ... */

echo $encoding;

代碼就是這樣了 ... 根據文件名來判斷系統 ...

簡體中文的 windows 會返回 EUC-CN ... 繁體中文我猜測應該是 EUC-TW 或者 BIG5 ...

Linux 和 MacOS 都是 UTF-8 ... 純英文的文件就別搗亂了 ...

應該是有編碼問題,舉例說明:mac下的壓縮,如果文件是中文名,到win下面解壓的時候全部是亂碼。所以在mac下面壓縮的時候,都盡量只用英文文件名。

11年的時候,有人提過類似問題:http://bbs.csdn.net/topics/370123319 ,文中的解決方案是說:查看http://www.pkware.com/documents/cases...,并搜索“Info-ZIP Unicode Path Extra Field”

搜索完這段內容:4.6 Third Party Mappings

------------------------

4.6.1 Third party mappings commonly used are:

0x07c8 Macintosh

0x2605 ZipIt Macintosh

0x2705 ZipIt Macintosh 1.3.5+

0x2805 ZipIt Macintosh 1.3.5+

0x334d Info-ZIP Macintosh

0x4341 Acorn/SparkFS

0x4453 Windows NT security descriptor (binary ACL)

0x4704 VM/CMS

0x470f MVS

0x4b46 FWKCS MD5 (see below)

0x4c41 OS/2 access control list (text ACL)

0x4d49 Info-ZIP OpenVMS

0x4f4c Xceed original location extra field

0x5356 AOS/VS (ACL)

0x5455 extended timestamp

0x554e Xceed unicode extra field

0x5855 Info-ZIP UNIX (original, also OS/2, NT, etc)

0x6375 Info-ZIP Unicode Comment Extra Field

0x6542 BeOS/BeBox

0x7075 Info-ZIP Unicode Path Extra Field

0x756e ASi UNIX

0x7855 Info-ZIP UNIX (new)

0xa220 Microsoft Open Packaging Growth Hint

0xfd4a SMS/QDOS

希望有用。

@Ven 就是文件名的編碼吧,稍微改了下樓上的代碼,我的系統是linux,所以要把非UTF-8的重新編碼為UTF-8open($zipfile_name);

if(true !== $res)

throw new Exception('Can Not Open Zip File '.$res);

$encoding = "UTF-8";

$controller = array("ASCII","UTF-8", "GB2312", "GBK", "BIG5");

for($i = 0; $i < $zip->numFiles; ++ $i){

$entry = $zip->getNameIndex($i);

$encoding = mb_detect_encoding($entry, $controller);

if( "UTF-8" !== $encoding)

$entry = iconv($encoding, "UTF-8", $entry);

echo $entry." ---> ".$encoding.chr(10);

}

$zip->close();

}

detect_encoding($argv[1]);

?>

正確答案見@Sunyanzi 的回答,這里再補充一些。

由于Windows系統的歷史原因,部分壓縮軟件生成的zip包,在用mb_detect_encoding()檢查文件名的編碼時,會得到類似“CP936”這樣的結果。我當時在這里被搞暈了,以為函數沒能正確檢測到編碼。實際上CP936是微軟自己的一套標準,基本上等于GBK。

而關于其他的“CP***”的編碼對應關系,或許可以參看這篇文章:Windows代碼頁

ZIP格式,似乎文件名沒有編碼這一說。

至于你說的解壓縮出現亂碼,這是解壓縮軟件的問題……

本文原創發布php中文網,轉載請注明出處,感謝您的尊重!

總結

以上是生活随笔為你收集整理的php zip 编码,encoding - 用PHP如何检测一个ZIP包内的文件是在何种编码的系统下创建的...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。