Web Analytics Made Easy - Statcounter

Bouncing ideas 생각 작업실/exp sharing 경험.실험 나누기

Mac에서 받은 파일 한글 깨짐 해결

sleepy_wug 2023. 8. 20. 09:03
반응형

0. 요약

Mac 시스템에서 한글로 쓴 파일이름이나 기타 텍스트를 다른 시스템에서 열었을 때 한글이 분해되어 보이는 경우가 있다. 아래의 스크린샷으로 예시한다. 골치아픈 문제이다. 이 포스팅에서 간단한 해결책을 제시한다. 그냥 결론부터 보고싶으면 [여기]를 클릭

 

ㅇㅏㅇㅏㅇㅏㅇㅏ ㅈㅓㅇㅅㅣㄴ ㄴㅏㄱㅏㄹ ㄱㅓㅅ ㄱㅏㅌㅇㅐ

 

이건 옛날 옛적 조합형-완성형 인코딩 논쟁을 떠오르게 하는데, 사실은 시스템 간 유니코드 정규화 방식 차이로 인한 것이고 해결은 어렵지 않다.

 

구체적으로 말했을 때 Darwin 계열 OS인 Mac은 한글 문자의 정규화 방식으로 NFD(Normalization Form Decomposition)를 사용하는데, Windows나 대부분의 Linux distribution에서는 NFC(Normalization Form Decomposition)를 사용하기 때문. 더 자세한 정보는 [Unicode documentation]이나 [친절한 한글 설명] 참조.

 

해결은 쉽지만 꽤나 성가시고, 그리고 이런 상황을 처음 접하는 사람에게는 공포스럽기까지 하기 때문에 쉬운 해결책을 이 포스팅에서 정리하고자 한다.

 

텍스트 처리 골치아파

 

목차

     

     

    1. 왜 깨지나: 유니코드 정규화 방식의 차이

    오늘날 컴퓨터에서 한글을 표현할 때는 유니코드UTF-8을 사용한다.[각주:1]

     

    Darwin 계열의 OS를 사용하는 Mac이나 iPhone 그리고 iPad에서는 한글 글자를 표현할 때 각각의 자모에 해당하는 유니코드 영역을 따로 저장하고 표현할 때 조합하여 나타낸다. 아래아한글 2010 이후 버전에서도 이 방식을 이용한다. 이를 NFD 혹은 '첫가끝' 방식이라고 한다. 반면 Windows와 Linux[각주:2]를 포함한 대부분의 OS에서는 한글을 음절(즉 글자) 단위로 저장하고 렌더링한다. 이를 NFC라고 한다. 

     

    언어학적으로는 당연히 첫가끝 방식이 타당하다. 또한 많은 경우 NFD로 정규화된 문자열도 최신 Windows에서는 잘 렌더링(표시)한다.

     

    예를 들어보자면 "이것" 은 NFC 방식으로 쓴 한글 문자이고, "이것"은 NFD 방식으로 쓴 것이다. 겉보기에는 다르지 않을 수 있다.

     

    그러나 내부적으로는 다르기 때문에 아래와 같이 Python console에서 eqaulity 조건문을 쓰면 FALSE가 나온다.

    "이것"과 "이것"은 다릅니다!

     

     

    2. 골치아픈 문제인 이유

    겉으로는 똑같아 보이더라도 내부적으로 다르기 때문에 골치아픈 경우가 여럿 생긴다.

     

    첫째, 애플기기에서 쓴 파일이름이 윈도우, 리눅스 등에서 제대로 렌더링되지 않는 경우가 많다. 이경우 ㅇㅣㄹㅓㅎㄱㅔ 깨져서 표현된다. 미적으로 좋지 못하다. 윈도우 유저라면 아래에 나와있는 애국가의 첫구절을 복사해다가 '메모장' 등에 붙여넣어보자.

    동해물과 백두산이 마르고 닳도록

    ㅇㅐㄱㅜㄱㄱㅏ 1ㅈㅓㄹ

     

    둘째, 더 큰 문제인데, 겉으로 똑같아 보여도 "같지 않기 때문에" 문자열 찾기 등을 쓸 수 없다. 메모장에 분명 "동해물과 백두산이 마르고 닳도록"을 붙여넣기 했는데, 메모장에서 "동해"를 검색할 수 없을 것이다.

     

    그렇기 때문에, NFD든 NFC든 하나로 통일해야 한다. NFC로의 통일이 대세인 듯하다. [각주:3] Dropbox에서는 NFD 방식 한글을 파일명을 지정할 경우, 업로드 시 자동으로 NFC로 변환한다. 심지어 macOS Catalina 이후에서 terminal로 사용되는 Zsh에서조차 NFC를 사용한다. 

     

    3. 아주 쉬운 해결책

    3.1 파일명이 NFD 방식이라 깨질 경우:

    드롭박스에 한번 올려보자. 드롭박스 폴더에 올라간 파일은 자동으로 NFC로 변환해준다.

     

    드롭박스 안쓰면 바로 아래에 제시된 방법을 쓰자. 

    반응형

     

    3.2 파일 내부의 텍스트가 NFD방식이라 깨질 경우:

    3.2.1 브라우저 상에서 해결하기

    지금 이 글 웹 브라우저로 읽고 있을테니, 개발자 도구(DevTools)의 콘솔창에 들어가 아래 자바스크립트 쓰자. 개발자 도구가 뭔지 모른다면 검색해보자. [크롬] [파이어폭스] 

     

    개발자 도구에 접근하는 단축키는 크롬 기준 F12 (윈도우) 혹은 ⌘ + ⌥ + I (MacOS)이다. 

     

    그리고 개발자 도구의 콘솔(console) 탭으로 간다.

    아래 그림에서 빨간색으로 표시된 곳이 개발자 도구 부분이고, 거기에서 파랑색 채워진 화살표로 표시된 Console 탭을 누르면 된다.

     

    콘솔 탭에 아래의 명령어를 입력한다.

     

    [Mac에서 첫가끝 형식으로 된 한글 스트링] 부분에 실제 string 넣으면 된다.

    const string1NFD = '[Mac에서 첫가끝 형식으로 된 한글 스트링]';
    const string1NFC = string1NFD.normalize('NFC');
    console.log(string1NFC)

     

    예를 들자면, const stringNFD = '동해물과 백두산이 마르고 닳도록'

    const string1NFD = '동해물과 백두산이 마르고 닳도록';
    const string1NFC = string1NFD.normalize('NFC');
    console.log(string1NFC)

     

     

    3.2.2 Python의 unicodedata 라이브러리 활용하기

    Python의 unicodedata 라이브러리의 일부인 normalize function을 사용하자. 

    import unicodedata
    
    def convert_normalization(input_str, to='NFC'):
        return unicodedata.normalize(to, input_str)

     

     

    3.2.3 아 나는 하나도 모르겠고 무서워

     

    만약 python이나 자바스크립트 쓸 줄 모르고 쓰고 싶지도 않다면, 위 python 함수에 GUI를 입힌 아래의 프로그램을 다운로드해서 쓰자. 그리고 감사의 의미로 커피 한 잔 값을 도네하자

     

    프로그램
    NFDtoNFC.exe
    18.36MB

    (확장자가 .exe인 만큼, Windows 전용)


    macOS용은: [다운로드 링크 (macOS)]

     

     

     

    '신뢰할 수 없는 프로그램' 등등의 메시지가 나올 수도 있는데, 왜냐면 나에게는 '신뢰도' 따위는 없기 때문이다.

     

    만약 당신이 나를 신뢰한다면, 우선 대단히 감사합니다. 아래에 '더보기'를 펼치면 실행하는 요령이 나와있다.

    더보기

     

     

     

     

    만약 당신이 얼굴도 모르는 일개 '언어학 하고있는' 블로거 [내 소개] 따위는 신뢰하지 않는다면, 아래의 python 소스코드를  다운받아서 직접 확인하고 컴파일 해서 쓰면 되겠다.

    assemble_hangul.zip
    0.09MB

     

     


    • 아래에 댓글창이 열려있습니다. 로그인 없이도 댓글 다실 수 있습니다.
    • 글과 관련된 것, 혹은 글을 읽고 궁금한 것이라면 무엇이든 댓글을 달아주세요.
    • 반박이나 오류 수정을 특히 환영합니다.
    • 로그인 없이 비밀글을 다시면, 거기에 답변이 달려도 보실 수 없습니다. 답변을 받기 원하시는 이메일 주소 등을 비밀글로 남겨주시면 이메일로 답변드리겠습니다.

     

    1. 물론, Windows 기반으로 작업하는 정신나간 한국 사람들은 아직도 유니코드 안쓰고 EUC-KR 쓰는 경우도 있음. 비록 아주 소수이기는 하지만 한국인이 만든 R코드를 쓰다가 뒤통수 맞은 경우가 많아서 늘 염두에 두어야 한다.ㅋㅋㅋ

      [본문으로]

    2. 안드로이드를 포함한다. [본문으로]
    3. 다시 말하지만 언어학적으로는 자모를 기저에서 분리해서 저장하는 NFD방식이 더 타당하다고 생각한다. 그러나 언어학 하는 건 컴퓨터의 다양한 용도 중 극히 일부이지 않은가 중요한건 통일하는 것이다. [본문으로]
    반응형