python

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

황인태(intaehwang) 2021. 12. 27. 16:58
반응형

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

이번 게시글은 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의 관계에 대해서는 따로 공부하고 올리는 것으로 해야할거 같습니다.

반응형