문자열이 오직 ASCII 문자로만 이루어져 있는지 확인하는 가장 직관적인 방법은 문자열의 각 문자를 하나씩 순회하면서, 해당 문자의 유니코드 코드 포인트가 ASCII 범위(0~127) 안에 속하는지 검사하는 것입니다.
방법 1: all() 함수와 ord() 함수 활용하기
def is_ascii(s):
return all(ord(c) < 128 for c in s)
print(is_ascii('ӓmsterdӓm'))출력 결과
False
'ӓ'처럼 키릴 계열의 문자는 코드 포인트가 128보다 크기 때문에 위 예제는 False를 반환합니다. 다만 이 방식은 문자 개수만큼 반복 연산을 수행하므로, 문자열이 길어질수록 성능이 크게 저하된다는 단점이 있습니다.
방법 2: 인코딩 예외 처리 활용하기 (권장)
더 효율적인 방법은 문자열을 ASCII로 인코딩해 보고 예외 발생 여부를 확인하는 것입니다. 파이썬 3에서는 str.encode('ascii')를 사용하며, ASCII 범위를 벗어나는 문자가 포함되어 있으면 UnicodeEncodeError가 발생합니다.
mystring = 'ӓmsterdӓm'
try:
mystring.encode('ascii')
except UnicodeEncodeError:
print('ASCII 문자열이 아닙니다')
else:
print('ASCII 문자열입니다')출력 결과
ASCII 문자열이 아닙니다
참고로 파이썬 2 환경에서는 mystring.decode('ascii')를 호출했을 때 UnicodeDecodeError가 발생하는지 확인하는 방식으로 동일하게 구현할 수 있습니다. 인코딩 검사는 C 레벨에서 내부적으로 처리되기 때문에 파이썬 루프를 직접 도는 첫 번째 방법보다 훨씬 빠릅니다. 따라서 대용량 텍스트를 다루는 실무 환경에서는 두 번째 방법을 사용하는 것이 좋습니다.