한번쯤 인코딩 이슈에 대해 정리해야지 라고 생각은 하고 있었다.
프로세싱을 하면서 자주 다루게 되는 내용이지만, 막상 같은 한글 파일을 처리하다 불러와지지 않는 경우를 마주하게 되면
맞왜틀 ?? 하면서 답답해하고 bytes를 까봐야 "아, 달랐구나" 라고 깨닫기 때문에 정리를 해보고자 한다!
인코딩 & 디코딩이란 ?
Encoding (사람 -> 컴퓨터)
- 컴퓨터에서 동영상이나 문자 인코딩 뿐 아니라 사람이 인지할 수 있는 형태의 데이터를 약속된 규칙에 의해 컴퓨터가 사용하는 0과 1로 변환하는 과정
- 사람 -> 컴퓨터 가 이해할 수 있도록 변환해주는 것
- ASCII, URL, HTML, Base64 인코딩이 존재하고, 각각 컴퓨터가 이해할 수 있는 언어로 바꿔준다.
- 문자(문자열)을 바이트 형식으로 변환
Decoding (컴퓨터 -> 사람)
- 역코드화 = 복호화
- 컴퓨터의 언어를 사람이 이해할 수 있도록 바꿔준다.
- 바이트 형식을 문자(문자열)로 변환
사실 인코딩 이슈로 애를 먹었던 적이 종종 존재했어서, 시간적으로 여유가 된다면.. 더 깊이 이해해보도록 해야겠다 !! 😅
내가 겪었던 이슈
test1 = '강원87바2010.jpg.json'
test2 = '강원87바2010.jpg.json'
다음 문자열 2가지의 차이를 알 수 있는가 ?
내가 읽어오지 못했던 이유는 `강원87바2010.jpg`라는 파일명을 가지고 `강원87바2010.jpg.json` 파일을 열어와야 했는데 매칭이 되지 않는 이슈였다.
맨 처음 이런 문제를 마주할 때 많이 당황했었던 ... ㅎ
맞왜틀!!! 🤯
이제 사람이 읽는 문자열을 컴퓨터가 읽는 bytes 코드로 변환해보자!
print('강원87바2010.jpg.json'.encode())
print('강원87바2010.jpg.json'.encode())
결과
b'\xe1\x84\x80\xe1\x85\xa1\xe1\x86\xbc\xe1\x84\x8b\xe1\x85\xaf\xe1\x86\xab87\xe1\x84\x87\xe1\x85\xa12010.jpg.json'
b'\xea\xb0\x95\xec\x9b\x9087\xeb\xb0\x942010.jpg.json'
짜잔, 전혀 다른 bytes를 발견할 수 있다 ㅎㅎㅎ
우리는 문자열을 볼 때, 같은 "한글" 이지만, 한글을 온전히 믿으면 안된다 !
사람의 문자를 컴퓨터에 변환해주지만, 우리 한글은 슬프게도 영어가 아니자네...
가끔 어떤 파일을 다운로드 받으면 한글이 이렇게 깨져있는 경우를 본 적 있을거다. 분명히 ㅎㅎ..
`ㅂㅗㄱㅗ서.pdf`, `2022ㅊㅜㅣㅇㅓㅂㅅㅓㄹㅁㅕㅇㅎㅗㅣ.docs`
이 문제의 원인은 MacOS와 Window 운영 체제에서 "한글"을 지원하는 유니코드 정규화 방식이 다르기 때문에 생기는 이슈이다.
Mac과 Window의 Encoding 방식의 차이
Mac은 NFD(Normalization Form Canonical Decomposition) ▶︎ 조합형
윈도우는 NFC(Normalization Form Canonical Composition) ▶︎ 완성형
다음과 같은 방식을 쓰기 때문이다.
<설명을 위한 예시 (코드는 그냥 내가 임의로 집어넣은 것!)>
조합형의의 예시
ㄱ : 001 ㅏ : 013 ㅇ : 008 ㅇ : 008 ㅜ : 025 ㅓ : 014 ㄴ : 002
▶︎ 001013008025014002
완성형의 예시
ㄱ : 001 ㅏ : 013 ㅇ : 008 ㅇ : 008 ㅜ : 025 ㅓ : 014 ㄴ : 002 가 : 130 강 : 353 우 : 111 워 : 146 원 : 503
▶︎ 353503
다음과 같이 완성형은 한글 조합을 하며 할당 하는 코드가 다르기 때문에 같은 한글일지라도 바이트 상에서는 전혀 다른 문자로 인식된다.
(Tip : 긴 bytes 코드가 합리적으로 "조합형"인 Mac -> NFD를 따를 경우가 많음)
Window와 Linux에서는 NFC 조합방식을 쓴다 !
-> 서버에서 작업을 할 경우는 해당하는 이슈가 없는데, Local에서 작업을 하고 한글명으로 저장 후 서버에 넘겼을 때, 인코딩 이슈 가능성이 존재함
맥이 국내 표준을 지키지 않음 ㅎㅎ
관련 참고 자료
https://ko.wikipedia.org/wiki/KS_X_1026-1
KS X 1026-1 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. KS X 1026-1은 2007년 12월 31일에 제정된 한국산업표준으로, 정식 표준명은 정보기술 – 국제문자부호계(UCS) – 한글 – 제1부: 정보교환용 한글 처리지침이다. 이
ko.wikipedia.org
해결 방법
파이썬 유저기 때문에 파이썬으로 파일을 열고 닫음..
NFD 를 NFC로 변환하여 인코딩 방식을 동일하게 맞춰준다
파이썬에서 변환 방법은 코드 첨부!
import unicodedata
def apply_NFC(path):
return unicodedata.normalize('NFC', path)
def apply_NFD(path):
return unicodedata.normalize('NFD', path)
처음 해당 이슈를 맞이했을때 가지가지 하네 ;; 라고 생각했는데, 한편으로는 음.. 진짜 컴퓨터는 거짓말을 안하긴 안하네 .. 라는 생각 ㅎㅎ
가장 좋은 해결방법은 ... 그냥 작업할때 한글 파일명을 쓰지마!!! ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
참고자료
https://egg-programmer.tistory.com/293
한글이 자소분리될 때 해결 방법(ㅎㅏㄴㄱㅡㄹ -> 한글)
운영체제마다 다른 '유니코드 정규화 방식' 대응하는 방법 업무를 진행하다가 파일 다운로드 시 'Windows' 환경에서 한글이 자음과 모음으로 분리되는 자음모음 분리 현상, 자소 분리 현상 이 발생
egg-programmer.tistory.com
NoonGam's IT 블로그
네트워크, 프로그래밍, IT 관련 배우고자 하는 블로그입니다.
wodonggun.github.io
'잡다 해결' 카테고리의 다른 글
[ChatGPT🤖] Google이 아닌 AI에 개발을 질문해 (1) | 2022.12.27 |
---|---|
[Linux] tmux로 생산성 높이기 (0) | 2022.11.14 |
[🛎 SLACK] SLACK 채널에 메세지 보내기 (Webhooks by Python) (0) | 2022.07.20 |
[오류 해결] aiohttp.client_exceptions.ClientConnectorCertificateError: 해결 (0) | 2022.04.10 |
[파이썬 - 가상환경] 'source'는 내부 또는 외부 명령, 실행할 수 있는 프로그램 또는 배치 파일이 아닙니다 (0) | 2022.02.26 |