문자열이 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') == 2
과 len(u'\u00e9') == 1
. 이것이 당신에게 중요하다면,를 사용하여 작성된 양식과 분해 된 양식을 변환 할 수 있습니다 unicodedata.normalize
.
유니 코드 용어집 은 각 특정 용어가 텍스트 표현의 다른 부분을 어떻게 나타내는지를 지적함으로써 이러한 문제 중 일부를 이해하는 데 유용한 안내서가 될 수 있습니다. 이는 많은 프로그래머가 인식하는 것보다 훨씬 복잡합니다.