조합형 한글, 완성형 한글을 아십니까

언젠가 이와 관련해서 양질의 포스팅을 써보려고 했는데 계속 미루기만할수는 없고 일단 부족하지만 관련 내용을 포스팅해봅니다.

 

 

한글은 알파벳과는 다르게 초성, 중성, 종성이 모여서 하나의 단어를 만듭니다

 

"김"이라는 단어는 "ㄱ", "ㅣ", "ㅁ" 이렇게 초성, 중성, 종성 세개의 조합이죠

 

 

프로그램 관점에서 보자면

 

초성, 중성, 종성을 각각 따로 처리하는 방식과

 

초성, 중성, 종성이 모두 합쳐진 하나의 글자를 처리하는 방식으로 나누어볼수 있습니다

 

 

바로 전자가 조립형 한글(NFD)이고, 후자가 완성형한글(NFC)입니다

 

맥이 대표적으로 NFD를 사용하고 윈도우를 비롯해서 대부분은 NFC를 사용합니다

 

 

특히 이 차이를 피부로 느낄수 있는 곳은

 

맥에서 전송한 파일을 윈도우에서 확인할때

 

ㅇㅏㄴㄴㅕㅇㅎㅏㅅㅔㅇㅛ.zip

 

이런식으로 파일이름이 변경되는것을 볼수 있는데요 맥과 윈도우가 한글을 다루는 방법에서 차이가 있기 때문입니다

 

 

윈도우는 완성형 한글을 사용하고

 

맥은 조립형 한글을 사용하기때문입니다.

 

 

 

아래의 샘플을 살펴보겠습니다

 

urlencode된 한글을 decode하면 실제로는 같은 "안녕하세요" 이지만 두개의 string이 같지 않습니다

 

실제로 안녕하세요는 5글자이지만 이 두개는 length도 다릅니다

 

이게 바로 한글조합형과, 한글완성형인 같지만 서로다른 글자입니다

 

 


aws s3 콘솔에서 파일업로드를 해봅시다



안녕하세요.xlsx

 

라는 이름의 파일을 맥에서도 만들어보고, 윈도우에서도 만들어서 업로드해보세요



맥은 조합형한글을 사용하기 때문에 s3 object 주소는 다음과 같은 주소를 갖게 됩니다

https://kkmtest.s3.ap-northeast-2.amazonaws.com/%E1%84%8B%E1%85%A1%E1%86%AB%E1%84%82%E1%85%A7%E1%86%BC%E1%84%92%E1%85%A1%E1%84%89%E1%85%A6%E1%84%8B%E1%85%AD.xlsx


윈도우는 완성형한글을 이용해서 s3 object 주소는 다음과 같은 주소를 갖게 됩니다


https://kkmtest.s3.ap-northeast-2.amazonaws.com/%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94.xlsx

s3는 같은 파일명을 올리게되면 옵션에 따라 기본적으로 덮어쓰기를 하는데

 

두개의 파일이 사용자가 보기에는 같은 "안녕하세요.xlsx"지만 모두 s3에 업로드가 되었습니다

 

url이 일단 길이에서도 확연한차이가 있네요

 

s3에 한글파일명의 파일을 업로드해서

 

s3 object가 한글이름으로 되었을때는 이 파일명이 조합형이냐 완성형이냐에 따라

 

이 s3 object의 주소가 서로 다르게 됩니다

 

조합형은 "ㅇ"인코딩 %E1%84%8B "ㅏ"인코딩 %E1%85%A1 "ㄴ"인코딩 %E1%86%AB
완성형은 "안"인코딩 %EC%95%88

 

이런식으로 urlencode를 했기때문에 같은 "안녕하세요"를 encode했지만

 

서로 다른 결과가 나온것입니다

 

 

s3 콘솔화면에서 파일명을 검색할때는 "한글완성형"으로 검색을 하기 때문에 완성형 한글파일명의 파일만 검색이 되고,

 

조합형으로 만들어진 파일은 한글명이 같더라도 검색되지 않습니다

 

 

그리고 많은 툴들이 완성형 한글을 사용하기 때문에

 

조합형 한글을 사용하면 같은 문제로 인해 이래저래 불편한 일이 많습니다

 

 

예를 들어 조합형 한글로 된 데이터를 DB에 저장했다고 합시다

 

DB툴을 이용해서 where 조건에 해당 한글의 데이터를 찾는 쿼리를 만들때도

 

대부분이 완성형을 기본으로 사용하기 때문에

 

분명 일치하는 한글로 검색했지만 완성형으로 조합형의 한글을 검색하려고 한것이기 때문에 원하는 검색결과가 보이지 않습니다

 

 

이러한 측면에서 볼때

 

파일명등을 다룰때는 한글보다는 유니크한 영문과 숫자등으로 구성된 이름을 사용해서 최종 사용자에게 serving할때만 한글로 바꿔주거나


파일명을 normalize 하여 일관되도록 저장하는 방법이 깨끗한 코드에 도움이 될것 같습니다

| 1 | ··· | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ··· | 1883 |