[JAVA] 맥(Mac OS)에서 파일 업로드 시 파일명 자모음 분리되는 경우(자소분리) 처리방법

[JAVA] 맥(Mac OS)에서 파일 업로드 시 파일명 자모음 분리되는 경우(자소분리) 처리방법

운영체제 맥(Mac OS)에서 파일 업로드 시 file 타입의 input 박스(<input type=”file”>)에 넣은 파일명이 “테스트.txt”일 경우, 백엔드(자바) 단에서 “ㅌㅔㅅㅡㅌㅡ.txt” 형태로 한글 자모음이 분리되어 온다.

이는 multipart/form-data 로 전송해도 그렇고 일반적인 parameter 로 전달해도 똑같다.

만약 프론트엔드에서 UTF-8로 인코딩하고 BASE64 로 감싸서 전달하더라도 문제는 동일하다. (ex : btoa(encodeURIComponent(“테스트”)); 를 파라미터로 전달)

BASE64 로 받은 파라미터 값을 백엔드(자바) 단에서 BASE64 디코드하고 URLDecoder.decode 처리해보면 동일하게 한글 자모음이 분리되어 있다.

만약 맥 OS에서는 글자가 “테스트”라고 정상적으로 보여도, 실제로는 “ㅌㅔㅅㅡㅌㅡ” 로 구성되어 있다는 것이다.

애초에 맥 OS가 인코딩 방식으로 NFD 라고 불리는 한글 조합형 방식을 사용하기 때문으로 보인다.

맥 OS는 NFD(Normalization Form Canonical Decomposition) 방식을, 윈도우 OS는 NFC(Normalization Form Canonical Composition) 방식을 사용한다고 한다. 맥 OS는 조합형 방식(ex : ㅌㅔㅅㅡㅌㅡ), 윈도우는 완성형 방식(ex : 테스트)이다.

다행히 이 두 가지 인코딩 방식은 자바 단에서 서로 교환 가능하다.

아래와 같이 사용하면 된다.

즉, 파일 업로드 시점에 아래 메서드를 태워서 운영체제에 맞게 문자열 값을 보정해주면 된다.

    /**
     * 맥 OS의 한글 인코딩 방식을 고려한 파일명 보정
     *
     * @param fileName
     * @param isMacOS
     * @param convertToMacFileName
     * @return
     */

    public static String convertFileNameForMac(String fileName, boolean convertToMacFileName) {
        if (fileName == null) {
            fileName = “”;
        }
        
        // 맥은 NFD(조합형), 윈도우는 NFC(완성형) 방식을 사용한다.
        if (convertToMacFileName) {
            // 윈도우 파일명 => 맥 파일명
            if (Normalizer.isNormalized(fileName, Normalizer.Form.NFC)) {
                fileName = Normalizer.normalize(fileName, Normalizer.Form.NFD);
            }
        } else {
            // 맥 파일명 => 윈도우 파일명 (맥에서 파일 업로드 시 사용)
            if (Normalizer.isNormalized(fileName, Normalizer.Form.NFD)) {
                fileName = Normalizer.normalize(fileName, Normalizer.Form.NFC);
            }
        }
        
        return fileName;
    }

참고사이트 1 : https://tt.kollhong.com/79

참고사이트 2 : https://gemimi.tistory.com/43