❰파이썬과 유니코드❱
-유니코드에 대해 배워 봅시다.
▶유니코드와 ASCII코드
컴퓨터가 문자를 다루기 시작한 초창기에는 ASCII 코드라는 최초의 문자 집합이 사용되었습니다. 하지만 ASCII는 영어와 숫자, 일부 기호만 표현할 수 있어 한계가 뚜렷했습니다. 그래서 각 나라에서는 자국어를 위한 인코딩(EUC-KR, Shift-JIS 등)을 따로 만들었지만, 서로 호환이 되지 않아 문자가 깨지는 문제가 발생했습니다.
이 혼란을 해결하기 위해 등장한 것이 유니코드(Unicode)입니다. 유니코드는 전 세계 모든 문자를 하나의 체계 안에 통합해, 어떤 언어든 표현할 수 있도록 했습니다. 또한 ASCII 영역(0~127)을 그대로 포함해 하위 호환성을 보장합니다. 결국 유니코드는 ASCII의 확장판이자, 다국어 지원을 위한 진화된 문자 집합이라고 할 수 있습니다.
▶파이썬으로 유니코드 문자열 다루기
파이썬은 유니코드를 완벽하게 지원하며, 문자열을 처리하는 데 있어 강력한 기능을 제공합니다. 파이썬 3부터는 모든 문자열을 유니코드 문자열로 취급하며, 이는 아스키 코드뿐만 아니라 전 세계의 다양한 문자와 기호를 다룰 수 있게 해줍니다.
파이썬 3의 문자열에는 두가지 종류의 문자열 객체가 있습니다.
유니코드의 문자열을 나타내는 str (문자열)로 텍스트 자체를 다룰 때 사용하며, 내부적으로는 유니코드 코드 포인트의 시퀀스로 저장됩니다. 예를 들어, s = '안녕'은 유니코드 문자열입니다.
그리고, 바이트열을 나타내는 bytes (바이트)는 컴퓨터가 실제로 데이터를 저장하고 전송하는 방식에 해당하는 바이너리 데이터입니다. 문자열을 파일에 저장하거나 네트워크로 전송할 때 사용하며, 문자열을 특정 인코딩으로 변환해야 합니다. 예를 들어, b = b'hello'는 바이트열입니다.
이제 위 두 문자열 객체를 인코딩과 디코딩을 해보겠습니다.
먼저 인코딩(Encoding) 입니다.
아래 예제처럼 문자열을 바이트열로 변환 하는 코드입니다.
지금 입력된 결과 값이 파일이나 네트워크에 저장/전송되는 실제 데이터 입니다.
UTF-8과 CP949는 필수로 사용해야하나?
파이썬3부터는 자동으로 유니코드 값으로 기본 인코딩이 되어있어 상관 없지만 파일 입출력, 네트워크 통신, 외부 데이터 처리 같은 경우는 인코딩을 명시하는 게 안전하기 때문에 꼭 입력 해야하는 건 아니지만, 호환성과 이식성 때문에
encoding="utf-8"을 습관처럼 써주는 게 좋습니다.
(특히 윈도우 환경은 cp949 기본값인 경우가 있으면 UnicodeEncodeError발생 가능. )
다음은, 디코딩(Decoding) 입니다.
아래 예제처럼 바이트열의 값을 문자열로 변환 하는 코드입니다.
b'\xed\x8c\x8c\xec\x9d\xb4\xec\x8d\xac', \xc6\xc4\xc0\xcc\xbd\xe3' 이렇게 바이트 열의 값이 '파이썬' 이라는 문자열로 변환 됩니다.
이제 입출력 인코딩과, 소스코드 인코딩을 배워보겠습니다
먼저, 입출력 인코딩은 파일을 읽고 쓸 때, 또는 콘솔에서 입력/출력할 때 문자열과 바이트를 변환하는 방식 입니다.
파이썬 내부 문자열은 항상 유니코드로 관리됩니다 하지만 파일은 바이트 단위로 저장되어야 하므로 인코딩 규칙이 필요한 것 입니다. 즉 파일에 "파이썬"이라는 문자열을 저장하거나 불러올 때 바이트 값으로 변경해야하기 때문에 인코딩 규칙이 필요합니다.
아래 예제를 참고하여 주시기 바랍니다.
위 예제를 보면 인코딩을 했는데 결과 값은 왜 '바이트'가 아니고 바이트 값이 '문자열로 디코딩' 된 값이 나오지 라고 생각하 실 텐데 파일을 읽을 때 open(..., encoding="utf-8")을 지정하면 파이썬이 자동으로 디코딩해서str(유니코드 문자열)로 반환하여 줍니다.
디코딩을 할 때
즉, 바이터 데이터(bytes)를 직접 다룰 때는 .decode("utf-8")같은 메서드를 호출해야 합니다.
파일 I/O에서는 자동 디코딩,바이트 객체를 직접 다룰 때는 수동 디코딩이 필요합니다.
자동과 수동의 차이를 정리하면
자동 디코딩: 파일, 네트워크, 표준 입력 등에서 인코딩을 지정해 열면, 파이썬이 알아서 bytes 를 str 변환
수동 디코딩: 이미 bytes 객체를 변수로 가지고 있을 때는, 개발자가 .decode()를 직접 호출
마지막으로, 소스코드 인코딩 입니다.
파이썬 소스 코드 파일 자체가 어떤 인코딩으로 저장되어 있는지 지정하며 파일 맨 위에 # -*- coding: utf-8 -*-을 표시 합니다.
파이썬 인터프리터가 .py 파일을 읽을 때, 그 파일 안의 문자열 리터럴(예: "안녕")을 어떤 인코딩으로 해석할지를 정하는 것입니다.
이것으로 유니코드에 대한 설명을 마치겠습니다!
고생많으셨습니다.😌
📘 참고:
《Do it! 점프 투 파이썬 (전면 개정 2판)》, 박응용 저, 이지스퍼블리싱, 2023
※ 본 글은 위 교재의 내용을 학습 및 정리 목적으로 요약/재구성한 글입니다.
'Python(파이썬)_점프 투 파이썬 > 파이썬 날아오르기' 카테고리의 다른 글
파이썬 정규표현식 (1) | 2025.09.21 |
---|---|
파이썬 타입 어노테이션 (1) | 2025.09.16 |
이터레이터와 제너레이터 (0) | 2025.09.16 |
클로저와 데코레이터 (0) | 2025.09.15 |