유니코드 문자 변환하기

한시온·2022년 2월 1일
0
post-thumbnail

계기

파이썬으로 백준 문제를 풀면서 파이썬에 문자를 아스키 코드값으로 변환하는 내장함수가 있다는 것을 알게 되었다. 그런데 chr() 함수와 ord() 함수의 차이를 잘 몰라서 공부하게 되었다.


유니코드

두 함수를 이해하기 위해서는 먼저 유니코드에 대한 이해가 필요하다.
유니코드란 전세계에 존재하는 무수히 많은 문자들을 일관되게 나타내기 위해 고안된 문자 인코딩 표준이다. 각 문자는 고유한 유니코드 코드값(unicode code point)을 가진다. 이 코드값은 여러 형식으로 변환될 수 있으며 개발자에게 익숙한 UTF-8 인코딩은 대표적인 유니코드 변환 형식(Unicode Transformation Format, UTF) 중 하나이다.
유니코드가 인터페이스라면 UTF-8은 구현체라고 할 수 있다.


UTF-8

UTF-8은 8비트 문자 인코딩 형식으로 유니코드 문자를 유니코드 코드값에 따라 8비트(1바이트) ~ 4바이트로 변환한다. 예를 들어 기본 로마자를 포함하는 U+0000 ~ U+007F 범위의 유니코드 문자는 8비트로 표시된다. 이는 7비트 ASCII 문자를 모두 나타낼 수 있음을 의미한다.
참고로 파이썬은 UTF-8을 기본 문자 인코딩 형식으로 정하고 있다.
링크


ord()

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

이 과정을 하나씩 살펴보면 다음과 같다.

  1. 유니코드 문자 a의 유니코드 코드값은 U+0061이다.
  2. 주어진 문자는 U+0000 ~ U+007F 사이에 있으므로 UTF-8형식에 따라 1바이트 0XXXXXXX로 나타낼 수 있다.
  3. 16진수 61은 이진법으로 1100001이다.
  4. 유니코드 문자 a는 1바이트(01100001)로 인코딩된다.
  5. 01100001은 십진법으로 97이다 (2^6 + 2^5 + 2^0).

chr()

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

요약

  1. ord(): 유니코드 문자 => 정수
  2. 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.

profile
가볍고 무겁게

0개의 댓글