자소분리

[macOS 한글 호환성 1편] 한글 자소분리 해결법

2019. 8. 28. 20:06

맥을 사용하면서 자주 접하게 될 한글 인코딩 호환성 문제

macOS에서 사용하는 한글 인코딩은 Windows와 다르다. 맥에서 만든 파일은 윈도우에서 자음과 모음이 분리되어 보인다. 많은 사람들이 이를 자소 분리현상이라고 말한다. 또한, 일부 사이트는 한글이 깨지거나, 다운로드한 파일의 이름이 깨지는 경우가 많다. 이 또한 인코딩이 달라서 생기는 문제이다.

이번 글에서 다룰 것은 아니지만, 이 현상은 iOS에서도 나타나는 현상이다. 하지만 지금까지 iOS 사용자들은 이런 불편함을 느끼지 못했다. 파일 공유가 어려워서, 다운로드한 파일을 수정하는 경우는 많지만, iOS 장치에서 파일을 생성하여 공유하는 경우는 거의 없었다. 또한, 주요 클라우드 서비스는 파일을 업로드하면 자소 분리를 해결해주기 때문에 한글 인코딩 문제가 크게 다가오지 않았다. 그런데, 앞으로는 iOS 사용자들도 자주 겪게 될 것이다. 9월 중 정식 공개될 iOS 13에서는 Files 앱을 통해 파일 관리를 쉽게 할 수 있다. 문제는 맥과 같은 인코딩을 사용하기 때문에 베타 사용자들 입장에서는 iOS 13에서 한글 처리에 문제가 생긴 것으로 느끼기도 할 수 있다는 것이다.

어쨌든, 이번 글을 통해 두 가지를 다룰 것이다.

  1. 업로드하는 파일의 자소 분리 문제와 해결법
  2. 다운로드하는 파일의 텍스트 깨짐과 해결법

원인

맥과 윈도우는 인코딩 방식이 다르다.

윈도우는 NFC(Normalization Form Canonical Composition) 방식을, 맥은 NFD(Normalization Form Canonical Decomposition) 방식을 사용한다. 한국어로는 보통 완성형, 조합형이라고 말한다.

조합형은 '콜'을 저장할 때, 'ㅋ' + 'ㅗ' + 'ㄹ'로 저장한다

문자 코드
11
12
13

이라고 하면 실제 저장 내용은 111213으로 저장된다
'ㅋ', 'ㅗ', 'ㄹ'을 입력하는 동안 코드는 11, 1112, 111213으로 바뀐다.

윈도우는 '콜'이라는 문자에 다른 코드를 할당한다.

문자 코드
11
12
13
2032
222355

이라고 하면 실제 저장 내용은 222355가 된다.

'ㅋ', 'ㅗ', 'ㄹ'을 입력하는 동안 코드는 11,2032,222355로 바뀐다.

위는 예시일 뿐이며, 실제로는 완성형 중에도 여러 가지, 조합형 중에도 여러 가지 인코딩 방법이 존재한다.

증상

두 가지 모두 표준 정규화 인코딩 방식이다. 맥은 윈도우에서 만든 파일을 제대로 처리할 수 있으니, 맥은 두 가지 표준을 모두 지원하는 셈이다. 다만 한국에서 지정한 KS 표준에서는 완성형 인코딩 방식을 한글 인코딩의 표준으로 정의하고 있다. 따라서 맥이 국내 표준을 준수하지 않은 것으로 봐야 한다. KS 위키 문서

2022.02.24
인코딩 출력에 관하여 책임 소재(?) 수정
인코딩 관련하여 "민중택배"님이 중요한 의견 주셨다.
오리지널을 중요하게 생각하는 사람으로서 댓글에 있던 부분을 그대로 남겨두는 방식으로 정보를 전달하고자 했다.
그러나 질답글이 많아지고 댓글을 읽기 어려워지면서 이 글이 윈도우가 표준을 미지원하는 문제의 근거로 사용되는 것을 확인했다.
따라서 해당 부분을 본문에 반영한다.

출처 : clien.net

해결법

하지만 점유율 부분에서 이런 문제를 신경 써야 하는 쪽은 맥 사용자다. 다행히도 맥에서는 완성형으로 인코딩 된 파일을 표시할 수 있다. 그래서 파일 명을 완성형으로 인코딩하면 된다.

convmv 설치

우선 convmv를 설치해야 한다. convmv는 CONVerts filenames from one encoding to another and MoVe라는 뜻으로, 인코딩을 바꾸는 툴이다. mv는 파일을 이동하는 명령인데, 이름을 바꾸는 데에도 사용한다. 그러므로 인코딩을 바꾸는 툴이라고 봐도 된다.

터미널을 열고 brew install convmv 를 입력한다. brew가 설치되어 있지 않다면 brew를 먼저 설치해야 한다. brew는 리눅스용으로 컴파일된 프로그램을 실행할 수 있게 해주는 환경을 만들어준다.

convmv 사용법

convmv -f utf8 -t utf8 --nfc --notest <filename>

텍스트 인코딩을 utf8에서 utf8로 바꾸는데, nfc 정규화 방식을 사용한다는 의미이다.

자세한 내용은 man convmv를 참고하면 된다.

2021.03.17
일부 시스템에서 convmv가 NFD로 정규화 된 파일을 인식하지 못하는 문제가 있어 수정 하였습니다.
원인을 정확히 할 수는 없지만, Argument로 파일 이름을 전달할 경우 convmv 프로그램이 인식하지 못하는 것 같습니다.
따라서 디렉토리를 인수로 사용하고, 해당 디렉토리에서 모든 파일을 검색하여 convmv를 실행하도록 변경하였습니다.

2021.05.21
3월 17일에 업데이트 한 내용 원상 복귀하였습니다.
지난 1여년 간 같은 문제가 계속 반복되어 문제를 우회할 수 있도록 코드를 수정하였으나,
최신 환경에서 문제가 해결된 것으로 보여 원상 복귀하였습니다.

추가로 프로그램 실행 결과가 알림으로 나타나도록 수정하였습니다.

Automator로 만들기

기존의 터미널은 파일을 직접 입력해야 한다. 하지만 오토메이터를 사용하면 Finder에서 파일을 선택하여 바로 실행할 수 있고, 또한 여러 파일을 자동화할 수도 있다.

실행 가능한 Workflow 파일 만들기

  • 오토메이터 실행
  • 새로 만들기
  • Quick Action 선택
  • 왼쪽 사이드바에서 Run Shell Script를 선택하고, 오른쪽으로 끌어온다.
  • 왼쪽 사이드바에서 Set Value of Variable을 선택하고, 오른쪽으로 끌어온다.
  • 왼쪽 사이드바에서 Display Notification을 선택하고, 오른쪽으로 끌어온다.
  • 오른쪽 패널을 이미지와 같이 바꾸고 입력한다.

for i in "$@"; do
    convmv -f utf-8 -t utf-8 --nfc --notest "$i"
done
  • 파일을 ~/Library/Services에 저장한다.

만약에 convmv를 찾을 수 없다는 메시지가 뜰 경우,
Intel 기반 맥에서는 convmv/usr/local/bin/convmv로 변경한다.
Apple Silicon 기반 맥에서는 convmv/opt/homebrew/bin/convmv로 변경한다.

Finder에서 사용할 수 있게 등록하기

  • 시스템 메뉴(애플 로고)
  • 시스템 환경설정(System Preferences)
  • Extentions
  • Finder
  • 방금 만든 Quick Action 선택

Finder에서 사용하기

이젠 아래 이미지처럼 사용하면 된다.

2021.03.17 일부 시스템에서 convmv가 작동하지 않던 문제 수정
2021.05.21 convmv 소스코드 원상 복귀 및 알림 추가
2021.11.17 Apple Silicon 기반 맥에서 convmv를 찾을 수 없는 문제 수정
2022.02.24 인코딩 출력에 관하여 책임 소재(?) 수정

  1. 이전 댓글 더보기
  2. 익명 2020.09.09 14:03

    비밀댓글입니다

    • BlogIcon 콜홍 2020.09.23 11:59 신고

      휴대폰을 바꾸면서 알림을 못 받았더니 이런 귀한 댓글에 답변을 못 드렸네요 ㅠㅠ

      확실히 맥에서 인코딩이 서로 다른 파일에 대해 작업하기 어려움이 있습니다.
      그래서 윈도우 사용자와 파일 공유를 하는게 아니더라도 인코딩을 바꿔두는게 편하기도 하지요.

      특히 구글 드라이브같은 파일 공유 서비스를 이용할 때 인코딩을 변경해주지 않는다면 파일이 겹치거나 동기화가 되지 않는 등 어려움이 있구요...

      좋은 의견 감사합니다!

  3. 감사합니다. 2020.12.23 22:16

    알려주신 정보 감사합니다 ^^

    정보 공유차 댓글을 달아 드립니다.

    현재 맥 OS 10.14.6 모하비를 사용중이고,

    알려주신 방법으로 파일 인코딩 변환을 할 때 맥 에서는 제대로 잘 보입니다.

    하지만, 다시 이 파일 을 윈도우 로 옮기면 파일명이 여전히 깨져 있네요.... ㅠㅠ

    특정 버전 에서는 convmv 가 정상적으로 작동되지 않는 듯 합니다.

    오토메이터, 쉘에서 직접 실행 모두 마찬가지입니다...

    • BlogIcon 콜홍 2020.12.31 20:56 신고

      그렇군요.
      최신 버전에서도 다시 한 번 확인 해봐야겠습니다. 감사합니다

    • BlogIcon 콜홍 2021.03.17 17:33 신고

      실행 코드 수정하였습니다.

      파일을 선택해서 서비스를 실행하면 같은 폴더의 모든 파일에 대해서 convmv가 실행됩니다.
      폴더를 선택해서 서비스를 실행하면 해당 폴더 내부에 있는 모든 파일에 대해서 convmv가 실행됩니다.

      파일 이름을 전달하면 인식하지 못하는 듯하고, 프로그래밍 방식으로 파일 이름들을 불러와 convmv로 실행하면 정상 작동하는 것 같습니다.

  4. mac초보 2021.01.29 16:37

    뭔가가 될듯한데
    사실 맥이 너무 어렵습니다.

    위에 있는 대로 따라서 하고는 싶은데 터미널은 너무 어렵고 오토메이터들어가봐도 잘 모르겠고

    위 설치 파일을 공유해 주실수 없는지요?

    • BlogIcon 콜홍 2021.02.09 08:12 신고

      제가 2탄에서는 오토메이터를 공유해드렸지만 1탄에서는 그러지 않았습니다.
      그 이유는 아래와 같습니다.

      1. 터미널에서 설치하는 프로그램에 의존합니다. 따라서 터미널을 직접 수행하지 않는다면 오토메이터는 실행되지 않습니다.

      2. 개발자가 아니라면 대부분 터미널이나 오토메이터는 낯선 기능입니다.
      대부분 독자분들이 해당 기능을 처음 접해보는 것입니다. 그래서 어떤 기능인지를 알아야 하고, 어떻게 수정하는지를 알아야 합니다.
      그런 것들은 약간의 설명이 덧붙여진 무작정 따라하기 방법으로 충분히 전달할 수 있습니다.


      그래서 1탄은 첨부파일 업이 작성한 것입니다. 이 점 참고하셔서 차근차근 다시 따라해보시길 바랍니다.

  5. DongHyun 2021.03.17 13:44

    k

  6. lee 2021.03.20 16:22

    안녕하세요 좋은 글 감사합니다. 글을 보고 그대로 따라해봤는데 커맨드 실행 시에 '=: line 8: convmv: command not found' 오류가 발생합니다. brew 이용해서 convmv 설치했고 계속해서 저 오류가 발생해서 reinstall까지 진행했는데 설치 후에 추가적인 설정이 필요한건가요? 참고로 m1 맥북 사용중인데 이 문제와 연관은 없을지 궁금합니다. 감사합니다

    • BlogIcon lee 2021.03.20 16:24

      참고로 터미널에서 convmv 입력 시 문제 없이 동작합니다

    • BlogIcon 콜홍 2021.03.20 16:33 신고

      convmv 대신 /usr/local/bin/convmv로 써보세요.
      또는 오토메이터에서 Run Shell Script 부분에 Shell을 선택하는 부분이 있습니다. 거기서 zsh을 선택 해보세요. 이미 zsh일 경우 bash로 바꿔보세요.

  7. 감사합니다 2021.03.24 16:26

    파일만 지정했을때는 파일명까지 경로로 받아서 not found 가 떨어지네요
    폴더만 가능한걸로 보여집니다.
    예를들어
    /users/Desktop/테스트.docx 를 자소분리수정 워크플로우 실행하면

    not found --
    /users/Desktop/테스트.docx/*
    이렇게 에러가 나네요.

    • BlogIcon 콜홍 2021.03.24 16:37 신고

      수정 했습니다!
      변수를 저장하고는 다른 변수를 사용해서 발생했던 문제입니다.

    • BlogIcon 감사합니다 2021.03.24 16:53

      빠른답변 감사합니다.
      와우....엄청빠르시네요....
      잘쓰겠습니다!!!

  8. 상원 2021.04.28 17:03

    안녕하세요, 전 텍스트파일이 아니라
    긁어낸 텍스트를 변환하고 싶어서
    여러모로 해보는데 잘 안되네요 ㅜㅜ

    제 업무가 지금처럼 덧글로 파일경로를 공유해야하는데
    MAC경로와 윈도우 경로의 구조가 달라서, 그 부분은 path converter(구글 크롭 앱)으로 해결하고 있지만,
    한글 폴더명같은 경우는 유니코드가 그대로라 애를 먹고있어요.

    그래서 오토메이터로 서비스를 만들어서, 긁어낸 텍스트 전체의 유니코드방식을 바꾸려고 하는데요


    automator에서 수신하는 작업흐름을 텍스트로 지정하고
    input as string 으로

    변환하고 싶은데..
    제가 코드를 잘 몰라서요,,,
    applescript 실행으로
    _______________________________
    on run {input, parameters}
    return iconv -f UTF-8-MAC -t UTF-8 (input as string)


    end run
    _______________________________

    구분까지는 넣었는데...

    $f는 어떤역할을 하는지, input as string 을 변환시키려면 어떻게해야하는지를 정말 구글링을 2시간 해도 못찾겠어요..
    쉘스크립트를 쓰려고 해도, "input as string"의 역할을 하는게 뭔지 모르겠고요...

    도와주시면 감사하겠습니다 ㅜㅜㅜ

    • BlogIcon 콜홍 2021.05.21 10:42 신고

      안녕하세요?

      convmv는 본문에 말했던 것처럼 파일 이름을 바꾸는 프로그램입니다.

      텍스트의 인코딩을 바꾸려 하신다면 2편을 참고하셔서 인코딩을 변경하시는 것을 추천합니다.

  9. 감사합니다. 2021.05.20 09:37

    지난번에 폴더만 가능하다고 답변달았던 사람인데요
    이번에 또 뭔가 바꼈는지
    파일을 자소분리수정 실행하면 해당파일을 찾지못하네요.
    os 패치때무인건가..

    • BlogIcon 콜홍 2021.05.21 11:49 신고

      이번에 다시 해보니 또 안되네요...

      일단 코드를 원래대로 되돌렸습니다.
      그랬더니 잘 되구요.

      지난번에 수정했던 코드가 버그를 우회할 수 있는 코드였고, 조금 말이 안되는 코드였어서 원래대로 되돌렸습니다.
      거의 1년째 문제가 해결되지 않아 수정했던건데, 이젠 문제가 해결 된 것 같습니다.

      convmv 2.05(오늘 최신버전), macOS 11.3.1에서 정상 실행 됩니다.

    • BlogIcon 감사합니다 2021.05.24 09:42

      감사합니다!!

  10. Youjin 2021.07.04 20:33

    안녕하세요 ㅠㅠ

    ‘셸 스크립트 실행’ 동작에 오류가 발생함: ‘-: line 1: /usr/local/bin/convmv: No such file or directory’

    자꾸 이 에러가 뜹니다. M1 입니다.

    • BlogIcon 콜홍 2021.07.04 21:46 신고

      제가 M1은 안 써봐서 잘 모르겠습니다.

      우선은 /usr/local/bin/convmv를 그냥 convmv로 바꿔보세요.

      그래서 해결이 안된다면 brew에서 convmv를 설치할 때 나오는 메시지를 잘 읽어보면 convmv가 설치되는 위치가 나올겁니다.
      그 위치를 /usr/local/bin/convmv 대신 바꿔보세요

  11. 민중택배 2021.07.20 05:28

    윈도우가 호환성이 떨어져서의 문제 보다는
    MacOS 는 국내 한글 표기 표준에 협조적이지 않다로 보아야할 것 같습니다

    https://ko.wikipedia.org/wiki/KS_X_1026-1

    현대한글의 경우 "한글 완성자"를 요구합니다.
    이 현상과 같은 혼란을 줄이기 위한 규정입니다.
    따라서 MacOS는 "정보교환용"의 목적으로
    외부에 데이터를 전송하거나 공유해야 할 때는
    "한글 완성자" 형태로 바꾸어서 전달할 수 있어야 합니다.

    • BlogIcon 최승규 2021.11.10 15:23

      가능하면 애플에도 문제제기해주세요 너무 귀찮은 문제네요.

  12. 최진생 2021.07.30 11:05

    ^^

  13. 최승규 2021.11.10 15:20

    convmv로 시도해봤는데도 여전히 분리되더군요 궁극적인 해결책은 애플의 정책을 바꾸는게 아닐까 합니다
    gmail이나 zoom으로 파일을 보내보시면 여전히 분리됩니다.

  14. ㅇㅇㅇ 2021.11.14 23:29

    감사히도 해당 기능을 알게되어 이것저것 테스트 해 본 결과, Automator 이용한 convmv 오류를 해결할 수 있었습니다.
    (MBP 13' / m1 / Mojave)

    먼저 Homebrew로 프로그램을 설치하신 경우, 프로그램의 경로가 다음과 같습니다.
    ---
    /opt/homebrew/bin/{프로그램 이름}
    ---

    따라서, 본문의 내용대로 하시되 다음 부분을 참고해주세요.
    1. Shell script 코드 내용 수정 (convmv 경로 수정)
    ---
    for i in "$@"; do
    /opt/homebrew/bin/convmv -f utf-8 -t utf-8 --nfc --notest "$i"
    done
    ---
    (왜인지 tab이 표시 안되네요.. '/opt/~' 앞에 tab으로 띄어주세요)

    2. '통과 입력(Pass Input)'은 '변수(Variable? 아무튼 stdin 아닌 것)'로 설정

    3. (선택) 정상 동작 후, 알림이 뜨게 하고 싶으시면 '알림 표시' 항목에 '제목' 또는 '부제목'을 필수적으로 입력
    예를 들면,
    ---
    제목 : Automator (custom)
    부제목 : 한글 파일명이 수정되었습니다.
    ---
    위와 같이 입력하시면 맥의 알림에 해당 내용이 표시됩니다.

    * 맥북에서 파일을 Gmail로 보내고 Window 노트북에서 다운로드 한 결과, 정상적으로 한글파일명이 표시됩니다.
    * Gmail이 아닌 경우는 확인해보지 못했습니다.

    자모분리 현상의 원인, convmv 프로그램과 Automator의 기능에 대해 자세히 소개해 주셔서 감사합니다, 친절한 콜홍님!

    • BlogIcon 콜홍 2021.11.17 13:57 신고

      상세한 설명 감사합니다!
      M1맥에서는 /opt/homebrew 안에 설치되는 것 같습니다.
      인텔맥 사용 중인데 /usr/local/Homebrew쪽에 설치되는 것 확인하였습니다.
      내용 반영해서 본문 수정하겠습니다.

  15. dw 2021.11.24 00:14

    intel mac os x 12 사용중 입니다.
    혹시나 싶어서 저도 경로확인까지 해 보고 다시 워크플로우 제작 해도 작동이 안되길래
    convmv -f utf-8 -t utf-8 --nfc --notest 파일경로/파일이름
    으로 convmv실행해보니
    0개의 파일을 컨버팅 하였습니다! 라고 떠버리네요.. 뭔가 os와 안맞는 건지.. 제가실수 한 건지..
    첨언부탁드립니다

  16. izeny 2021.12.04 04:26

    오우~!! 파일명 자소 분리 때문에 신경 쓰였었는데 덕분에 해결되었네요. 너무 감사합니다 ^^

  17. 박서연 2022.01.12 13:25

    ‘셸 스크립트 실행’ 동작에 오류가 발생함: ‘zsh:2: command not found: convmv’

    실행 시 이렇게 문구가 뜨는데, 혹시 해결할 방법이 있을까요

  18. 박서연 2022.01.12 13:25

    ‘셸 스크립트 실행’ 동작에 오류가 발생함: ‘zsh:2: command not found: convmv’

    실행 시 이렇게 문구가 뜨는데, 혹시 해결할 방법이 있을까요

  19. 박서연 2022.01.12 13:26

    ‘셸 스크립트 실행’ 동작에 오류가 발생함: ‘zsh:2: command not found: convmv’

    이렇게 뜨는데 해결할 수 있을까요?

  20. 박서연 2022.01.12 13:26

    ‘셸 스크립트 실행’ 동작에 오류가 발생함: ‘zsh:2: command not found: convmv’

    이렇게 뜨는데 해결할 수 있을까요?

  21. neotrue 2022.04.14 14:41

    Apple Silicon 기반 맥북에서 잘 동작함을 확인하였습니다.
    노트북 바꾸고 설마해서 와봤는데, 내용도 업그레이드 되는 걸 보니 콜홍님의 열정이 느껴집니다. 정말 감사합니다~!!!

+ Recent posts