파이썬으로 크롤링하여 CSV로 파일을 추출하면 간혹 한글이 깨지는 상황을 만나게 됩니다.
물론 파이썬이 아니더라도, CSV파일을 엑셀에서 읽다보면 한글이 깨지는채로 나오는데요.
아주 간단하게 파일을 크롤링하고 이를 CSV로 출력하면 한글이 포함되는 경우 아래처럼 한글이 깨집니다.
엑셀 CSV 한글 깨지는 이유?
엑셀에서 CSV가 깨지는 이유는 엑셀이 UTF-8로 인코딩된 파일을 잘못 열어서 인데요.
Excel default encoding depends on the system. The workaround is to put three magical bytes to the file beginning. They are called BOM (Byte order mark) and say to the editor that file is encoded as UTF-8.
사실 이 문제는 좀더 깊게 들어가면 조합형과 완성형 한글의 표현을 알고 있으셔야 합니다.
컴퓨터에서 한글 표현(인코딩)은 크게 조합형과 완성형으로 나뉩니다.
조합형
한글의 편리함을 그대로 가지고 있는 방식으로 초성,중성,종성의 3Byte로 글자를 표현합니다.
완성형 방식
문자 하나하나를 완성되어져 잇는 글자로 인식합니다. 즉 위에처럼 가각간 중에서 원하는 글자를 찾아서 불러오게 됩니다.
누가봐도 조합형이 편리함을 알 수 있습니다.
그리고 조합형 방식의 한글의 대표적인 인코딩은 UTF-8, 그리고 완성형 한글의 대표적인 인코딩은 EUC-KR입니다.
위의 표만 보면 사용하기 편리한 조합형(UTF-8)이 주로 사용될 것 같은데요.
하지만 편리하고 좋다고 해서 꼭 대세가 되지 않습니다.
윈도우에서 사용되는 CP949
왜냐하면 컴퓨터에서 가장 많이 사용되는 MS의 윈도우의 인코딩 방식이 완성형이기 때문입니다.
Windows가 사용하는 인코딩은 기본적으로 EUC-KR에서 진화한 CP949를 사용합니다.
방금 엑셀에서 깨진 파일을 다시 열옵면 기본이 949로 설정되어 있음을 알 수 있습니다.
웹에서 많이 사용되는 UTF-8
이번에는 조합형인 UTF-8을 한번 알아보겠습니다.
유니코드가 널리 쓰이기 전부터 형성된 인터넷 문서들은 대부분 아스키 코드를 기본으로 해서 작성되었고,
특히 기존의 HTML 태그나 자바스크립트 등 아스키로 구축된 사이트를 별다른 변환 처리 없이
그대로 쓸 수 있는 엄청난 장점이 있었다.
더군다나 UTF-8은 엔디안에 상관없이 똑같이 읽을 수 있으므로 크로스플랫폼 호환성도 뛰어났다.
UTF-8은 가장 많이 사용되는 가변 길이 유니코드 인코딩이다. 켄 톰슨과 롭 파이크(Go 언어를 만든 사람)가
만들었다. UTF-8이란 말은 Unicode Transformation Format - 8bit에서 유래했다고 합니다..
즉 어떤 장치에서도 호환성이 높고, 단일 코드이기 때문에 다른 국가에서 한글 언어팩이 설치되지 않았다고 하더라도
한글 표현이 가능합니다. 즉 이러한 장점으로 윈도우조차도 10부터는 점차 UTF-8 방식으로 변화해가고 있습니다.
이제 원인을 알게되었으니 UTF-8을 제대로 읽어보는 방법을 알아보겠습니다.
엑셀에서 UTF-8로 불러오기
가장 먼저 엑셀에서 UTF-8로 다시 불러오는 방법이 있습니다.
데이터 - 텍스트/CSV에서를 눌러
아까 949로 인코딩 된 것을 65001:유니코드(UTF-8)f로 변경해 줍니다.
그러면 바로 정상적으로 한글이 표현되는 것을 알 수 있습니다.
메모장을 활용해서 UTF-8로 변경하기
메모장을 통해서 UTF-8로 강제 설정할 수 있습니다.
아까 위에서 살펴본 BOM(Byte order mark)을 활용한 방법인데요.
즉, UTF-8로 읽으라는 문구를 상단에 넣어줘서 엑셀이 바로 읽을 수 있게 됩니다.
다만 BOM을 넣게 되면 다시 서버 등에서 사용할때 잘못 인코딩 될 우려가 있습니다.
변환하고자 하는 파일에 마우스 우 클릭하여 - 편집으로 메모장에서 엽니다.
이 후 파일 다른이름으로 저장을 클릭합니다.
그리고 파일 형식은 모든파일로 변경한 다음,
인코딩을 UTF-8(BOM)으로 변경합니다.
그리고 저장을 누르면 이제 바로 UTF-8로 엑셀에서 인식하고 열게 됩니다.
아래와 같이 깔끔하게 열리는 것을 확인할 수 있습니다.
그리고 CMD 명령어로 할 수도 있는데요.
CMD 명령어로 UTF-8(BOM) 전환하기
먼저 빈 파일을 UTF-8(BOM) 방식으로 저장합니다.
그리고 간단하게 배치파일을 하나 만들었는데요.
copy 명령어로 복사하는 것인데요.
copy a+b c 이런 명령어를 치면 a+b를 더해서 c라는 파일을 만들게 됩니다.
즉, 앞에 빈 BOM파일과 뒤에 CSV파일이 합쳐져서 새로운 BOM인코딩의 CSV파일이 만들어집니다.
저는 change_bom.csv라는 파일을 생성하였는데요. 원하는 파일로 하시면 됩니다.
copy /b = 바이너리 파일 /y = 덮어쓰기
@echo off
copy /b /y bom.txt+*.csv change_bom.csv
그리고 이걸 클릭하면 자동으로 UTF-8(BOM)파일로 인코딩이 됩니다.
전체 CSV파일을 읽도록 배치를 만들어서 수정하셔셔 사용하셔야 합니다.
간단히 실행모습을 보여드렸는데요. 깨지지 않고 잘 됨을 알 수 있습니다.
좀 더 기능을 추가하고 싶지만 제가 배치 파일을 잘 만들진 못해서요.
여기서 if문등을 활용하면 더 이쁘게 활용할 수 있을 것 같습니다.
그럼 잘 사용하시기 바랍니다.
'Tip & Tech > Python' 카테고리의 다른 글
파이썬 웹페이지 표 크롤링 하는 방법(make2d) (10) | 2022.03.08 |
---|---|
파이썬 텔레그램 챗봇 만들기 - 인포메시지 및 명령어 설정하기 (10) | 2022.02.23 |
유튜브 채널 ID 추출하는 방법 (8) | 2022.01.26 |
파이썬 텔레그램 챗봇 만드는 방법 (20) | 2022.01.07 |
PIP 명령어 정리 (14) | 2022.01.03 |