< 返回版块

lj94093 发表于 2019-11-30 02:10

我有一个zip压缩包,里面只有一个中文文件名的文件:JVM 虚拟机创建对象的过程分析

我使用zip库对这个压缩包进行读取,发现读出来的文件名是这样的:"JVM ╨Θ─Γ╗·┤┤╜¿╢╘╧≤╡─╣²│╠╖╓╬÷.docx"

我有试过用rust-encoding进行编码转换,但是不管怎么试都不成功

let fname=std::path::Path::new(apk_path);
let file =fs::File::open(&fname).unwrap();
let mut archive=zip::ZipArchive::new(file).unwrap();
for i in 0..archive.len(){
    let mut file = archive.by_index(i).unwrap();
    let outpath = file.sanitized_name();
    let name=outpath.file_name().unwrap();
    println!("{:?}",name);
// 下面是一些尝试
//        let buffer=GB18030.encode(name.to_str().unwrap(),EncoderTrap::Strict).unwrap();
//        let (buffer,code,result)=UTF_16BE.encode(name.to_str().unwrap());
//        let (buffer,coding,result)=UTF_8.encode(name.to_str().unwrap());
//        let s=GB18030.decode(&buffer,DecoderTrap::Strict);
//        let s=String::from_utf8(buffer.to_vec());
}

有人能解答一下这个中文文件名要怎么正确的显示出来吗?

评论区

写评论
作者 lj94093 2019-11-30 22:19

对以下内容的回复:

试了一下,确实是这样!

感谢!

去源码里看了下,发现它的实现是通过entry的flag判断是utf8还是cp437编码,但是现在很多zip包用的是操作系统的编码,没有跟随zip的标准,所以它强行用cp437来解码了

Aloxaf 2019-11-30 12:47

你得 decode file_name_raw

1 共 2 条评论, 1 页