最近编写一个小功能接口的时候出现了一点小插曲。因为我是要用PHP从本地查找本批次ipa包,并解析信息,发送到远端服务器。
一、zip_open() 对中文文件路径,需要转换成 gb2312 再打开,不然会
1 // $ipa_file 如果含有中文,需要转换成gb2312编码,不然zip_read会报错 2 if(! $handle = zip_open($ipa_file)) return FALSE; 3 while($read_handle = zip_read($handle)) 4 { 5 if(zip_entry_name($read_handle) === 'iTunesMetadata.plist') 6 { 7 if(zip_entry_open($handle, $read_handle, 'r')) 8 { 9 $plist = zip_entry_read($read_handle, '10240'); 10 if(! preg_match('#<key>itemId</key>\s*<integer>(\d+)</integer>#', $plist, $matches)) return FALSE; 11 return $matches[1]; 12 zip_close($handle); 13 continue; 14 } 15 else 16 { 17 return FALSE; 18 } 19 } 20 }
二、glob() 取得的数组中,值有中文则是当前文件编码,没有则ASCII
首先我从本地用 glob 函数查找压缩包。检测得到编码输出如下(我文件编码是UTF-8):
D:\Downloads\ipa\update\Wikihood + 1.3.3.ipa | ASCII
D:\Downloads\ipa\update\iShredder 2.1.ipa | ASCII
D:\Downloads\ipa\update\南都周刊 1.1.ipa | UTF-8
D:\Downloads\ipa\update\生理节律 3.7.ipa | UTF-8
D:\Downloads\ipa\update\阅客 1.0.ipa | UTF-8
*所以glob()得到的路径,给zip_open已经不需要转编码到gb2312了。
我只需要这些.ipa的plist文件信息,和这个文件名作为一个数组POST出去。
三、basename() 此函数有中文路径则是当前编码(UTF-8), 没有则ASCII,
但不解的是在POST前仍要把数组元素往UTF-8转换一次,不然远端收到乱码,
$ipa_name = mb_convert_encoding(basename($ipa_file), 'UTF-8', 'gb2312');
// ……
$datas = serialize($ipa_name);
我的文件编码和页面输出是UTF-8, 如此便正常了。
浙公网安备 33010602011771号