반응형

먼저 아스키코드란 1963년 미국 ANSI에서 표준화한 정보교환용 7비트 부호체계이다.

https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C

알고리즘을 풀다가 주어진 알파벳이 있을때 이를 아스키코드로 변환하는 문제가 나와 알아보게 되었다.

1. 아스키코드 -> 문자열

SQL이나 C, C++ 에서는 문자열을 뜻하는 값으로 char (character) 를 사용한다. python에서는 아스키코드를 문자열로 변환하는데 내장함수 chr() 을 사용한다.

asc_code = 65
answer = chr(asc_code)
print(answer)
print(type(answer))
------------------------------------
>>> 'A'
>>> <class 'str'>

chr()을 통해 변환된 아스키코드는 string type의 문자열로 반환된다.

1-1) 문자로 변환할 수 없는 아스키코드

변환하고자 하는 값이 아스키코드가 아닌경우, 이를 chr() 함수 사용시 에러가 발생한다.

asc_code = 134583495739845
answer = chr(asc_code)
--------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: chr() arg not in range(256)

에러를 확인해 보면 chr() 내장함수 안의 값은 범위 0부터 256미만 까지만 입력이 가능하다고 한다.

b_code = 1.5
b = chr(b_code)
--------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: integer argument expected, got float

또한 python의 내장함수 chr()에는 int 타입의 수만 들어가야 한다.

1-2) 문자로 변환 가능 최소값, 최대값

# 아스키코드 0의 문자열 변환
zero_code = 0
zero_answer = chr(zero_code)
print(zero_answer)
print("---" + zero_answer + "---")
print(type(zero_answer))
------------------------------------------
>>>
>>> ------
>>> <class 'str'>
# 아스키코드 255의 문자열 변환
max_code = 255
max_answer = chr(max_code)
print(max_answer)
print(type(max_answer))
>>> ÿ
>>> <class 'str'>

이때 0의 코드값은 없는값 (공백도 아님) 으로 변환되고, 255은 특수문자로 변환된다.

2. 문자 -> 아스키코드

문자열을 해당하는 아스키코드로 변환하는데에는 python의 내장함수 ord() 가 사용된다. ord는 ordinal position을 뜻하며, 문자의 순서 위치 값 을 의미한다.

a = "A"
a_code = ord(a)
print(a_code)
print(type(a_code))
------------------------------------------
>>> 65
>>> <class 'int'>

이때 변환된 아스키코드값은 'int' 형이다.

2-1) 아스키코드로 변환할 수 없는 문자 : 문자열

a = 'AAAAA'
a_code = ord(a)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 5 found

에러를 확인해 보면 ord() 내장함수의 파라미터 값으로는 character 만 가능한데, 길이 5의 문자열이 사용되었다고 한다.
이를 통해 문자 와 문자열이 구분되야 하며, ord() 에는 문자열이 아닌 문자가 사용되어야 한다는걸 알 수 있다.

b = 'ㄱ'
b_code = ord(b)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 3 found

한글은 보이는것과 달리 영어처럼 단일 문자 취급되지 않는다.

2-2) 아스키코드로 변환할 수 없는 문자 : 0

위의 1-2 에서 확인한 문자 변환 내장함수 chr()의 범위를 통해 아스키코드 0과 255로 변환해보자

min_str = ''
min_code = ord(min_str)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 0 found

ㅜㅜ... 아스키코드 0을 문자로 변환했을때 없는값이 출력되어 똑같이 빈 string을 아스키코드로 변환하려 했더니 오류가 발생했다.
아스키코드 0은 없는값, 즉 Null 값을 반환하기 때문에 이를 구현할 수 없는 것이다.
혹시나 해서 None을 변환해 보려 했지만 실패!

min_str = None
min_code = ord(min_str)
------------------------------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected string of length 1, but NoneType found
반응형

+ Recent posts