본문 바로가기
python

CentOS에서 python3를 이용하여 파일 encoding 방식 변경하기

by 황인태(intaehwang) 2021. 12. 27.
반응형

안녕하세요 황인태입니다.

이번 게시글은 CentOS에서 python3를 이용하여 파일의 encoding 방식을 변경하는 방법에 대해 알려드리겠습니다.

개발을 하다보면 가끔씩 한글이 깨지는 현상이 나타납니다. 저는 주로 linux에서 python으로 한글을 사용해야할 때 자주 발생하였습니다.

이게 다 encoding 때문이였습니다.

이게 다~~~~~~

 

이랬는데
왜 구랩...

저희 회사의 OS는 다음과 같습니다.

  • 로컬 pc : windows10
  • 개발서버 : CentOS 7

(맥북으로 바꿔주세요 대표님!)


1. encoding

한글이 깨지는 원인은 encoding에 있습니다. 글자를 표현하는 방법에 조합형과 완성형이 있고 아스키랑 ANSI는 뭐고... 사실 이런거는 잘 모르겠고 대부분이 utf-8과 euc-kr의 문제 입니다. "그렇다면 파일을 오픈할때 UTF-8로 read하면 되잖아요!"

 사랑해요 vscode

네 맞아요 그렇게 하면 됩니다. ms excel에서 깨지게 보이는거지 vscode로 open하면 문제 없습니다. 근데 확장자가 csv말고 xlsx인데 인코딩이 깨진다면...? 


 

2. code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def cal(extend, title, fileStreNm, dirPath):
 
    if (extend == "csv"or (extend == "xlsx"or (extend == "xls"):
        rootPath = dirPath
        before = rootPath + fileStreNm
        after = rootPath + fileStreNm + "." + extend
 
        # charSet 확인
        chkCharset = subprocess.check_output("file -i " + before, shell=True, encoding='utf-8')
        chkCharset = str(chkCharset)
        chkCharset = chkCharset.replace("text/plain; charset=""").strip()
 
        fileNames = ""
        if chkCharset == "iso-8859-1":
            os.system("iconv -c -f euc-kr -t utf-8 " + before + " > " + after)
            os.remove(before)
            fileNames = glob.glob(after)
            print("iso-8859-1(euc-kr) to utf-8")
        else:
            print(chkCharset)
            os.rename(before, after)
            fileNames = glob.glob(after)
cs

 

제가 작성한 소스코드의 일부분을 보시면 python3에서 shell 명령어를 실행하기 위해 2 가지 방법을 사용하였는데요. line 9의 subprocess lib와 line 15의 os lib 입니다. 둘다 동일하게 shell 명령어를 실행할 수 있지만 subprocess의 check_output을 사용하면 실행 결과를 문자열로 return 받을 수 있습니다.

line 14에 보시면 iso-8859-1 일때 euc-kr에서 utf-8로 변환하라는 코드입니다. iso-8859-1인데 euc-kr로 변환을 하는지 의문이 생길 수 있는데요 결과부터 알려드리자면 실제로 iso-8859-1를 utf-8로 변환을 하면 여전히 폰트가 깨집니다.

아니 왜 나에게 이런 시련이...

그래서 과정에 오류가 있나 돌아가 보면 과연 file 명령어로 케릭터셋을 확인했을 때, ios-8859-1이 맞는지 확인이 필요 했습니다. vscode로 인코딩을 변경하다 보니

file 명령어로 ios-8859-1로 확인된 케릭터 셋이 vscode에서는 euc-kr로 추측하고 있습니다.

어라? 그럼 한번 euc-kr로 해봐? 라는 생각으로 작성한 코드입니다.

논리적인 방법은 아니지만 글이 상당히 길어질거 같고 깊이가 있는 내용으로 예상되어 ios-8859-1 과 euc-kr의 관계에 대해서는 따로 공부하고 올리는 것으로 해야할거 같습니다.

반응형
Buy me a coffeeBuy me a coffee

댓글