파이썬으로 백준 문제를 풀면서 파이썬에 문자를 아스키 코드값으로 변환하는 내장함수가 있다는 것을 알게 되었다. 그런데 chr()
함수와 ord()
함수의 차이를 잘 몰라서 공부하게 되었다.
두 함수를 이해하기 위해서는 먼저 유니코드에 대한 이해가 필요하다.
유니코드란 전세계에 존재하는 무수히 많은 문자들을 일관되게 나타내기 위해 고안된 문자 인코딩 표준이다. 각 문자는 고유한 유니코드 코드값(unicode code point)을 가진다. 이 코드값은 여러 형식으로 변환될 수 있으며 개발자에게 익숙한 UTF-8
인코딩은 대표적인 유니코드 변환 형식(Unicode Transformation Format, UTF) 중 하나이다.
유니코드가 인터페이스라면 UTF-8은 구현체라고 할 수 있다.
UTF-8
은 8비트 문자 인코딩 형식으로 유니코드 문자를 유니코드 코드값에 따라 8비트(1바이트) ~ 4바이트로 변환한다. 예를 들어 기본 로마자를 포함하는 U+0000
~ U+007F
범위의 유니코드 문자는 8비트로 표시된다. 이는 7비트 ASCII
문자를 모두 나타낼 수 있음을 의미한다.
참고로 파이썬은 UTF-8
을 기본 문자 인코딩 형식으로 정하고 있다.
링크
Given a string representing one Unicode character, return an integer representing the Unicode code point of that character. For example, ord('a') returns the integer 97 and ord('€') (Euro sign) returns 8364. This is the inverse of chr().
파이썬의 내장(built-in)함수인 ord()
함수는 유니코드 문자를 파라미터로 받아서 문자에 대응하는 코드값을 반환한다. 예를 들어 ord(a
)는 정수 97
를 반환한다.
print(ord('a')) # 97
이 과정을 하나씩 살펴보면 다음과 같다.
a
의 유니코드 코드값은 U+0061
이다.U+0000
~ U+007F
사이에 있으므로 UTF-8
형식에 따라 1바이트 0XXXXXXX
로 나타낼 수 있다.61
은 이진법으로 1100001
이다.a
는 1바이트(01100001
)로 인코딩된다.01100001
은 십진법으로 97
이다 (2^6 + 2^5 + 2^0).Return the string representing a character whose Unicode code point is the integer i. For example, chr(97) returns the string 'a', while chr(8364) returns the string '€'. This is the inverse of ord().
위의 ord()
함수를 이해했다면 chr()
함수는 어렵지 않다. ord()
함수가 유니코드 문자에 해당하는 코드값을 반환했다면 chr()
함수는 코드값에 대한 유니코드 문자를 반환한다. 예를들어 chr(97
)은 a
를 반환한다.
print(chr(97)) # a
ord()
: 유니코드 문자 => 정수chr()
: 정수 => 유니코드 문자https://docs.python.org/3/library/functions.html#chr
https://docs.python.org/3/library/functions.html#ord
https://docs.python.org/3/howto/unicode.html#:~:text=UTF%2D8%20is%20one%20of,used%20than%20UTF%2D8.)
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_0000~0FFF
https://ko.wikipedia.org/wiki/UTF-8
https://ko.wikipedia.org/wiki/ASCII
http://tutorials.jenkov.com/unicode/index.html#:~:text=Each%20character%20is%20represented%20by,as%20one%20or%20more%20bytes.