압축풀기 인코딩 에러

freejia·2021년 10월 7일
0

개발환경

IDE: IntelliJ
Framework: Spring Boot 2.4.11 Project
Gradle
oracle java 11
os: macOS X


Unzip 구현 중에 UTF8인코딩 에러

압축 파일 푸는 것 구현 중에 압축 파일 내부에 파일목록을 리스트업 하는 부분이 있었다.
파일 명에 한글이 들어간 파일명 때문에! 에러가 난다!
자바에서 기본으로 제공하는 java.util.* 들은 한글이 깨진다고 한다.

압축 풀 때 한글 안깨진다는 apache.commons.compress에 가봤다.

라이브러리 추가 시 jar 파일을 프로젝트에 추가하면 되는데,
그동안 MVN central 검색 후, gradle dependencies 만 간단하게 추가해봐서 당황했다.

commons compress 다운받기

Download 탭에 들어가서 Binaries 로 되어있는 쪽을 다운로드 받자.

jar 파일이 있다!

jar는 실행가능한 바이너리코드
Source는 OS에 맞게 컴파일이 필요한 코드.

라이브러리 jar 추가하기

  1. 프로젝트 경로에 libs 디렉토리 만들기

  2. 디렉토리에 jar 복붙해서 넣기

  3. build.gradle 열고 dependencies에 컴파일 할 jar 경로 적어주기

	compile files('libs/commons-compress-1.21.jar')


참고) jar 개수가 많아서 libs 디렉토리 내 모든 jar 컴파일

	compile fileTree(dir: 'libs', include: ['*.jar'])
  1. 코끼리 동기화 버튼 클릭: Load gradle Changes

compression로 압축풀기

인코딩 문제

압축 푸는 코드는 아래와 같다.

    // 압축 풀기
    public void saveUnzipFiles(String getStoreFileName, String itemName) throws IOException {

        CompressionUtil cu = new CompressionUtil();
        File sourceZipFile = new File(fileDir + getStoreFileName); // zip파일 경로
        File targetDirPath = new File(fileDir + itemName); // 압축 풀 디렉토리 명

        // 압축 풀기
        cu.unzip(sourceZipFile, targetDirPath);

    }

cu.unzip(sourceZipFile, targetDirPath, 인코딩);
마지막 인자에 인코딩을 추가해 줄 수 있다.

추가하지 않으면 아래와 같은 에러가 난다.

검색해보니 Mac OS X의 바이트 순서 때문이라고 한다.

"ISO-8859-1" 인코딩을 쓰면 런타임 에러는 안나지만, 압축 풀어보면 파일명이 깨진다.

        cu.unzip(sourceZipFile, targetDirPath, "ISO-8859-1");

"EUC-KR" 로 쓰면 안깨진다!!!!! 야호오💛

cu.unzip(sourceZipFile, targetDirPath, "EUC-KR");


궁금한 것

  • URI가 URL에는 URI가 포함되어 있는데. 차이 ?
    -> 식별자가 뭐든 간에 결국엔 HTTP 요청을 할 때 자원의 주소로 찾아가야 한다.
    Identifier 식별자: 홍길동. (고유 이름)
    Locator 주소: 서울시 양천구 목1동 @@아파트 홍길동.

  • 라이브러리 다운 받을 때, Binaries 와 Source 차이 ?
    -> jar는 컴파일 결과 실행가능한 파일이다. Source는 OS에 맞게 필요에 따라 컴파일 하라고 Source 로 릴리즈 한다.

  • 한글 표현을 위해 UTF-8만 생각했었는데.. 인코딩 마다의 차이?

참고 포스팅

CompressionUtil.java

profile
코딩 리딩 라이딩💛

0개의 댓글