[python] 파이썬에서 문자열이 ASCII인지 확인하는 방법?

문자열이 ASCII인지 여부를 확인하고 싶습니다.

나는 알고 ord()있지만 ord('é'), 시도 할 때 나는있다 TypeError: ord() expected a character, but string of length 2 found. 필자는 파이썬을 구축 한 방식으로 인해 발생한다는 것을 이해했습니다 ( ord()문서에 설명되어 있음 ).

확인하는 다른 방법이 있습니까?



답변

def is_ascii(s):
    return all(ord(c) < 128 for c in s)


답변

당신이 옳은 질문을하지 않는 것 같아요.

파이썬의 문자열에는 ‘ascii’, utf-8 또는 기타 인코딩에 해당하는 속성이 없습니다. 문자열의 소스 (파일에서 읽거나 키보드에서 입력하는 등)는 문자열을 생성하기 위해 ASCII로 유니 코드 문자열을 인코딩했을 수 있지만 그 곳에서 답을 찾아야합니다.

아마도 당신이 물어볼 수있는 질문은 “이 문자열이 ASCII로 유니 코드 문자열을 인코딩 한 결과입니까?”입니다. -다음을 시도하여 답변 할 수 있습니다.

try:
    mystring.decode('ascii')
except UnicodeDecodeError:
    print "it was not a ascii-encoded unicode string"
else:
    print "It may have been an ascii-encoded unicode string"


답변

파이썬 3 방법 :

isascii = lambda s: len(s) == len(s.encode())

확인하려면 테스트 문자열을 전달하십시오.

str1 = "♥O◘♦♥O◘♦"
str2 = "Python"

print(isascii(str1)) -> will return False
print(isascii(str2)) -> will return True


답변

Python 3.7의 새로운 기능 ( bpo32677 )

문자열에 대한 더 이상 번거롭고 비효율적 인 ASCII 검사, 새로운 내장 str/ bytes/ bytearray방법- .isascii()문자열이 ASCII인지 확인합니다.

print("is this ascii?".isascii())
# True


답변

최근에 이와 같은 문제가 발생했습니다. 나중에 참조 할 수 있습니다.

import chardet

encoding = chardet.detect(string)
if encoding['encoding'] == 'ascii':
    print 'string is in ascii'

당신이 함께 사용할 수있는 :

string_ascii = string.decode(encoding['encoding']).encode('ascii')


답변

Vincent Marchetti는 올바른 아이디어를 str.decode가지고 있지만 Python 3에서는 더 이상 사용되지 않습니다. Python 3에서는 다음을 사용하여 동일한 테스트를 수행 할 수 있습니다 str.encode.

try:
    mystring.encode('ascii')
except UnicodeEncodeError:
    pass  # string is not ascii
else:
    pass  # string is ascii

잡으려는 예외도에서 UnicodeDecodeError로 변경되었습니다 UnicodeEncodeError.


답변

질문이 잘못되었습니다. 당신이 보는 오류는 파이썬을 어떻게 빌드했는지에 대한 결과가 아니라 바이트 문자열과 유니 코드 문자열 사이의 혼란의 결과입니다.

바이트 문자열 (예 : 파이썬 구문에서 “foo”또는 “bar”)은 8 진수 시퀀스입니다. 0-255 사이의 숫자. 유니 코드 문자열 (예 : u “foo”또는 u’bar ‘)은 유니 코드 코드 포인트의 시퀀스입니다. 0-1112064의 숫자 그러나 문자 é에 관심이있는 것으로 보입니다 (단말기에서). 단일 문자를 나타내는 멀티 바이트 시퀀스입니다.

대신 다음을 ord(u'é')시도하십시오.

>>> [ord(x) for x in u'é']

“é”가 나타내는 일련의 코드 포인트를 알려줍니다. 그것은 당신에게 줄 수도 있고 [233], 줄 수도 있습니다 [101, 770].

chr()이것을 뒤집는 대신 다음이 있습니다 unichr().

>>> unichr(233)
u'\xe9'

이 문자는 실제로 하나 또는 여러 개의 유니 코드 “코드 포인트”로 표현 될 수 있으며, 그 자체는 그래픽 또는 문자를 나타냅니다. “e는 예음 악센트 (예 : 코드 포인트 233)”또는 “e”(코드 포인트 101)와 “이전 문자의 예음 악센트”(코드 포인트 770)입니다. 따라서이 동일한 문자가 Python 데이터 구조 u'e\u0301'또는 로 표시 될 수 있습니다 u'\u00e9'.

대부분 걱정할 필요는 없지만, 유니 코드 문자열을 반복하는 경우 분해 할 수있는 문자가 아닌 코드 포인트별로 반복이 작동하므로 문제가 될 수 있습니다. 즉, len(u'e\u0301') == 2len(u'\u00e9') == 1. 이것이 당신에게 중요하다면,를 사용하여 작성된 양식과 분해 된 양식을 변환 할 수 있습니다 unicodedata.normalize.

유니 코드 용어집 은 각 특정 용어가 텍스트 표현의 다른 부분을 어떻게 나타내는지를 지적함으로써 이러한 문제 중 일부를 이해하는 데 유용한 안내서가 될 수 있습니다. 이는 많은 프로그래머가 인식하는 것보다 훨씬 복잡합니다.