문자를 표현하는 방법 및 인코딩과 디코딩

매일 공부(ML)·2022년 2월 24일
0

ASCII

아스키 코드는 1 byte로 영문자와 숫자, 그리고 일부 특수문자들을 표현할 수 있습니다.

ord() 함수를 사용하면 다음과 같이 각각의 문자에 대한 아스키 코드 값을 확인할 수 있습니다.

print(ord('H'))
# 72
print(ord('e'))
# 101
print(ord('\n'))
# 10

유니코드(Unicode)

유니코드 체계는 이미 몇 십억개의 문자를 포함하고 있으며, 새로운 문자 몇 십억개를 더 저장할 여력이 있습니다.

유니코드를 압축하는 UTF-8, UTF-16, UTF-32 등 다양한 방법이 있지만 가장 실용적인 방법은 UTF-8을 사용하는 것입니다.

예전 파이썬 2.x 버전에서는 유니코드로 나타내고 싶으면 별도의 문자열 앞에 'u'라는 문자를 넣어주어야 했습니다.

# Python 2.7.10 
x = '이광춘'
print(type(x))
# <type 'str'>
x = u'이광춘'
print(type(x))
# <type 'unicode'>

그런데 파이썬 3.x 버전부터는 기본적으로 문자열이 유니코드로 저장이 됩니다.

# Python 3.5.1
x = '이광춘'
print(type(x))
# <class 'str'>
x = u'이광춘'
print(type(x))
# <class 'str'>

하지만, 파이썬 내부에서 데이터를 사용하는 것이 아니라 네트워크를 통해 데이터를 주고 받을 때는 다른 형태로 데이터를 변환해야하는 경우도 있습니다.

다음 코드에서 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n' 문자열은 유니코드입니다.

따라서 데이터를 전송하기 전에 UTF-8 byte 방식으로 인코딩를 해주어야 하는데, 그럴 때 사용되는 메소드가 encode() 입니다.

'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
그리고 이렇게 인코딩된 문자열을 소켓을 통해 전송합니다.

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)

이제 서버에서 받은 데이터를 data라는 변수에 저장합니다. 그

리고 이 데이터는 현재 디코딩이 안 되어있기 때문에 decode() 메소드를 사용해 디코딩하여 출력하면 유니코드 형태로 우리에게 보여지는 것입니다.

while True:
    data = mysock.recv(512)
    if (len(data) < 1):
        break
    print(data.decode())
mysock.close()
profile
성장을 도울 아카이빙 블로그

0개의 댓글