HOWTO · Python

Python에서 문자열을 바이너리로 변환

이 문서에서는 Python 문자열을 유니코드 코드 포인트 값으로 나타내거나, 선택한 텍스트 인코딩으로 변환한 바이트 값을 이진수로 표현하는 방법을 설명합니다.

이 페이지의 내용

작업에 맞는 표현 방식을 선택하세요. ord()는 각 문자의 유니코드 코드 포인트를 가져오고, 문자열을 먼저 인코딩하면 선택한 텍스트 인코딩에 따른 바이트를 얻습니다. 일부 텍스트에서는 두 방식의 값이 서로 다릅니다. 접두사 없는 이진 숫자가 필요하면 format(value, "b")를 사용하고, 0b 접두사를 원하면 bin(value)를 사용하세요.

각 문자의 유니코드 코드 포인트를 ord()와 format()으로 이진수로 변환하기

ord()로 문자의 유니코드 코드 포인트를 가져온 다음, b 형식 지정자를 사용해 format()으로 해당 정수를 2진수로 표현합니다. 이 방식은 코드 포인트를 나타내며, 문자열을 UTF-8 바이트로 인코딩하지는 않습니다. 숫자는 고정된 자릿수에 맞춰 채워지지 않습니다.

문자열 Python의 각 코드 포인트를 형식화하고 공백으로 연결하는 실행 가능한 예제입니다:

text = "Python"
binary_code_points = " ".join(format(ord(character), "b") for character in text)
print(binary_code_points)

인코딩된 문자열의 바이트를 bytearray()와 format()으로 이진수로 변환하기

인코딩된 바이트를 나타내려면 먼저 인코딩을 선택해 bytearray()에 전달합니다. 내장 bytearray() 형식은 결과 바이트 값을 하나씩 순회하며, format(value, "08b")는 각 바이트를 8자리 이진수로 표시합니다. UTF-8은 많은 문자에 여러 바이트를 사용하므로, 이 값의 개수는 원래 문자열의 문자 수보다 많을 수 있습니다.

이 예제는 café를 UTF-8로 인코딩한 뒤 각 바이트를 형식화합니다:

text = "café"
encoded_bytes = bytearray(text, "utf-8")
binary_bytes = " ".join(format(value, "08b") for value in encoded_bytes)
print(binary_bytes)

map()과 bin()으로 0b 접두사가 붙은 바이트 값 만들기

map()은 반복 가능한 객체의 각 항목에 변환을 적용합니다. 그 자체로 문자열을 인코딩하지는 않습니다. 여기서는 먼저 bytearray()가 텍스트를 UTF-8로 인코딩하고, map(bin, ...)이 결과 바이트 값을 변환합니다. format(value, "b")와 달리 bin()은 0b 접두사를 붙입니다. 숫자만 필요한 출력 형식이라면 format()을 사용해 접두사 없이 표현할 수 있습니다.

text = "Python"
binary_bytes = " ".join(map(bin, bytearray(text, "utf-8")))
print(binary_bytes)

ASCII 인코딩은 ASCII 문자만 있는 텍스트에 사용하기

ASCII는 제한된 문자 집합을 위한 인코딩입니다. Python 같은 텍스트에는 사용할 수 있지만, é와 같은 문자는 인코딩할 수 없습니다. 이런 텍스트에 .encode("ascii")를 호출하면 UnicodeEncodeError가 발생합니다. 일반적인 유니코드 텍스트를 바이트로 표현할 때는 UTF-8을 사용하세요. Python은 문자열을 자동으로 UTF-8 바이트로 바꾸지 않으므로 원하는 인코딩을 지정해야 합니다.

ASCII 문자만 있는 텍스트에서는 ASCII 인코딩을 명시해 같은 방식으로 바이트를 형식화할 수 있습니다:

text = "Python"
encoded_bytes = text.encode("ascii")
binary_bytes = " ".join(format(value, "08b") for value in encoded_bytes)
print(binary_bytes)