JS Mac 파일 이름 정규화 인코딩 문제

문제

파일 업로드 시 파일명에 '-', '_' 을 제외한 특수 문자 사용 시 예외를 발생시키는 코드에서 아래와 같은 정규표현식을 사용했고, 테스트 결과 문제가 없음을 확인했다.

/^[ㄱ-ㅎ가-힣a-zA-Z0-9_\s-]*$/

 

이후 파일명에 문제가 있는지 확인하기 위해 파일명과 똑같은 문자열을 비교하였으나, 다른 결과가 나왔고 문자열의 길이 또한 다르게 출력되었다.

 

원인

MacOS의 유니코드 정규화 인코딩 방식이 javascript의 기본 문자열과 다르기 때문이었다.

 

Mac에서는 NFD 방식을 사용하는데,  NFD 방식으로 작성된 문자열은 ['ㅎ', 'ㅏ', 'ㄴ', 'ㄱ', 'ㅡ', 'ㄹ']과 같이 초성, 중성, 종성으로 분리된 문자 배열이고 Javascript에 일반 문자열은 ['한', '글']과 같이 완성형 문자 배열이다.

 

내가 작성한 정규식은 모음만 사용되는 경우를 허용하지 않았고, NFD에서 분리된 모음이 검사되어 예외가 발생한 것이다.

 

 

해결방법

업로드된 파일의 이름을 NFC 방식으로 변환

Javascript에서는normalize( ) 함수를 사용해서 파라미터로 어떤 정규화 방식을 사용할 지 명시해 줄 수 있다.

기본값은 NFC이며, 자세한 사용법은 MDN normalize에서 확인할 수 있다.

 Array.from(filename.normalize( ))

 

정규식에 모음만 사용하는 경우도 허용하도록 추가

/^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9_\s-]*$/