我有一个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());
}
有人能解答一下这个中文文件名要怎么正确的显示出来吗?
1
共 2 条评论, 1 页
评论区
写评论对以下内容的回复:
试了一下,确实是这样!
感谢!
去源码里看了下,发现它的实现是通过entry的flag判断是utf8还是cp437编码,但是现在很多zip包用的是操作系统的编码,没有跟随zip的标准,所以它强行用cp437来解码了
你得 decode
file_name_raw