엑셀과 인코딩(UTF-8)의 싸움, 이젠 끝내기로 해(feat.몽고MongoDB와 날짜 처리)

엑셀 인코딩 문제를 해결하고, mongoDB에 깔끔하게 저장하는 방법

주로 csv 형식의 파일을 열거나 하나의 프로그램에서 다른 형식의 문서를 불러오면 아래와 같은 문자를 만나는 경우가 있습니다.

�����������Ǹ�

.<-9xH#,;}<:@O,A& 8q,;

이는 문자 인코딩에서 발생하는 문제로, 영어로 썼는데 프랑스어로 해석하는 것과 비슷하다고 보시면 될 것 같습니다.

인코딩 문제는 주로 비알파펫(非 ALPHABET) 언어를 사용하는 곳에서 자주 발생합니다.

컴퓨터에서 처음 문자가 사용될 때는 한 문자 당 1바이트를 사용하는 알파벳만 지원되었으므로 이 때는 문자 인코딩이고 뭐고 할 게 없었습니다.

그러나 차츰 컴퓨터의 사용 영역이 넓어지고 컴퓨터에서 처리할 수 있는 데이터도 늘어나자 다른 언어를 지원하기 위한 방법이 연구되었고, 그 결과 다양한 문자 인코딩이 탄생하였습니다.

한글과 관련한 인코딩만 찾아봐도 아래와 같이 다양합니다.


ASCII(American Standard Code for Information Interchange)

-7bit로 구성되며, 128개의 영문자를 표현

ANSI(American National Standard Institute)

-8bit로 구성되며, 256개의 문자를 표현

EUC-KR(Extended Unix Code – Korea)

-16bit로 구성되며, 글자 하나하나에 부여된 코드를 사용. 중국어, 일본어, 한국어 등의 표현에 사용

CP-949(Code Page 949)

– Windows의 코드 조합으로 EUC-KR의 확장

UTF-8(Universal Coded Character Transformation Format 8 bit)

– 가변 길이 문자 인코딩으로 1~4바이트까지 사용. 우리가 원하는 그것.


위와 같이 다양한 방식을 사용해 문자를 표현하고 있습니다.

하지만 우리를 화나게 하는 것은 엑셀에서 csv로 내보낸 파일을 다른 프로그램(또는 DB)에서 불러오려고 하면 ‘???????’ 라고 표현하는 그것일 것입니다.

원인을 살펴보면, 해당 문제를 겪는 대부분은 Windows + 엑셀의 조합일텐데요.

Windows는 기본적으로 CP-949로 인코딩을 하지만 읽는 프로그램은 UTF-8을 사용하다 보니 주로 발생하는 문제입니다.

따라서 인코딩 시 UTF-8로 내보내기만 하면 문제는 해결되지만 Windows는 쉽게 UTF-8로 바꿔주려고 하지 않습니다…

그래서 엑셀로 내보내는 csv 파일을 UTF-8로 변환하는 방법에 대해 알아보겠습니다.

위와 같은 데이터를 가진 엑셀 친구를 UTF-8 형식으로 만들어 보겠습니다.

먼저 저 친구를 그냥 csv로 내보내기를 하면 Windows에서 지정한 인코딩 형식으로 내보내기가 됩니다.

확인해볼까요?

엑셀 2010을 사용해 테스트를 진행해보겠습니다.

다른 설정 없이 위와 같이 CSV 형식으로 다른 이름으로 저장을 하고 mongoDB에서 가져오기를 하면 다음과 같이

‘알아듣게 얘기하라’는 식의 반응을 보입니다…

그럼 이제 엑셀에서 인코딩 형식 지정하여 내보내기를 해보겠습니다.

저장 시 위와 같이 [도구-웹 옵션]으로 들어가면

이렇게 친절하게 [인코딩] 탭에서 인코딩 형식의 지정이 가능합니다…..만

파일명을 test(set).csv로 저장해보았습니다.

하지만 mongoDB에서 위 파일을 불러오면

mongoDB가 왜! 뭐! 라고 하는 것 같습니다.

엑셀에서 인코딩 형식을 지정해도 제대로 반영이 되지 않는 것 같습니다.

물론 최신 엑셀에는 ‘csv 내보내기(UTF-8)’과 같은 방식의 확장자 유형의 선택이 생겼으나 현재는 엑셀 최신 버전이 없어 서 테스트가 불가하므로… 다음.

여기서는 다른 방식으로 인코딩 형식을 변경해 보도록 하겠습니다.

엑셀로 저장한 csv를 메모장으로 불러옵니다(엑셀 파일이 아닌 csv 파일입니다).

메모장에서 ‘다른이름으로 저장’을 선택하여 아래와 같이 인코딩을 UTF-8로 변경해줍니다.

csv 파일 형식은 유지해야 하므로 파일 형식은 모든 파일(*.*)로 변경해주고 파일 이름의 확장자에는 .csv를 유지합니다.

그리고 다시 한번 mongoDB에서 조우를 해보겠습니다.

더이상 반항하지 않습니다.

하여, IMPORT를 눌러보면!

문맹은 벗어났으나….

이제는 날짜를 못 알아먹네요.

날짜도 입맛에 맞게 맞춰주겠습니다.

먼저 날짜를 모두 선택하고 ‘.’으로 구분된 기호를 ‘/’로 변경해줍니다.

CTRL + H를 사용합니다.

변경 후 해당 칼럼(또는 해당 셀)을 날짜 형식으로 변경해줍니다.

DB에 저장될 타입을 Date로 변경해줍니다.

그리고 마지막으로 기회를 한번만 더 주겠습니다.

그리고 IMPORT!

더 이상 반항을 하지 않는 착한 데이터를 표현합니다.

위 날짜 데이터는 toLocaleDateString()과 같은 자바스크립트 함수로 깔끔하게 정리해주면 이쁘게 출력이 가능합니다.

그럼 더 이상 엑셀과 인코딩으로 스트레스 받지 않기를 바랍니다.

peace!