본문 바로가기
JAVA

[Zip4j] 압축 파일 안의 파일명 UTF-8 여부 확인 하여 압축 해제 테스트 진행

by Hwoarang757 2024. 7. 8.

[Zip4j] 압축 파일 안의 파일명 UTF-8 여부 확인 하여 압축 해제 진행 테스트

 

Windows 환경에서 제공되는 압축 기본 프로그램으로 압축을 진행 하거나 , 공개용 압축 프로그램 기본 설정으로 MSBC (멀티바이트 문자 집합) 으로 압축을 진행 하는 경우에

 

Java zip4j를 이용하여 기본적으로 압축 해제 시에 Charset을 cp949로 설정해주지 않으면 파일명이 깨지는 것을 확인 할 수 있었습니다.

 

이를 zip4j에서 제공하는 isFileNameUTF8Encoded() 메서드를 이용하여 UTF-8 로 인코딩 되어있는지 여부를 체크 하고 Charset을 설정 하는 방법을 테스트 하였습니다.

 

package com.gmission.test.controller;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Map;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.ZipFile;


@RestController
@RequestMapping("/test")
@Slf4j
public class ZipTestController {

	@GetMapping("/zipExtractTest")
	public void zipCompressTest(@RequestParam Map<String,Object> map) throws IOException {
		
		//String filePath = "D:/새 압축-UTF8.zip";
		String filePath = "D:/새 압축-cp949.zip";
		ZipFile zip2 = new ZipFile(filePath);
		
		
		log.info("zipCompressTest={}", zip2.getCharset().toString()) ;
		log.info("first={}",zip2.getFileHeaders().stream().findFirst().get().isFileNameUTF8Encoded());
		
		if(zip2.getFileHeaders().stream().findFirst().isPresent() &&
		  !zip2.getFileHeaders().stream().findFirst().get().isFileNameUTF8Encoded()) {
			zip2.close();
			
			zip2 = new ZipFile(filePath);
			zip2.setCharset(Charset.forName("cp949"));
			log.info("zip2.setCharset={}" , zip2.getCharset());
		}
		
		zip2.getFileHeaders().forEach(a -> {
			log.info("a.isFileNameUTF8Encoded()={}",a.isFileNameUTF8Encoded());
			log.info("Filename={}",a.getFileName());
		});
		
		//zip2.extractAll("D:/새 압축");
		
	}
	
	
	
	
}

 

결과 1. MBCS 으로 압축되어 있는 파일명일 경우

 

 

결과 2. UTF-8 으로 압축되어 있는 파일명일 경우