답변:
def is_ascii(s):
return all(ord(c) < 128 for c in s)
ord(c) < 128것보다 무한히 더 읽기 쉽고 직관적c <= "\x7F"
당신이 옳은 질문을하지 않는 것 같아요.
파이썬의 문자열에는 '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"
strPython 2, bytesPython 3)에서 사용하기 때문 입니다.
str모든 ISO 인코딩에서 A 를 먼저 유니 코드로 인코딩해야합니다. 대답은 이것에 들어가야합니다.
s.decode('ascii') if isinstance(s, bytes) else s.encode('ascii')파이썬 3에서 입력 유형에 따라 두 가지를 모두 사용해야합니다. OP의 입력은 바이트 문자열 'é'(파이썬 2 구문, 파이썬 3은 당시에 릴리스되지 않았습니다)이므로 .decode()정확합니다.
str파이썬 2에서는 바이트 문자열입니다. .decode('ascii')모든 바이트가 ASCII 범위에 있는지 확인하는 데 사용 하는 것이 좋습니다 .
파이썬 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
isasciiisascii('somestring')Trueisascii('àéç')False
try: s.encode('ascii'); return True except UnicodeEncodeError: return False(위와 비슷하지만 파이썬 3에서는 문자열이 유니 코드이므로 인코딩) 이 답변은 또한 대리가있을 때 Python 3에서 오류를 발생시킵니다 (예 : isascii('\uD800')반환하는 대신 오류 발생 False)
문자열에 대한 더 이상 번거롭고 비효율적 인 ASCII 검사, 새로운 내장 str/ bytes/ bytearray방법- .isascii()문자열이 ASCII인지 확인합니다.
print("is this ascii?".isascii())
# True
"\x03".isascii()또한 사실입니다. 문서에 따르면 모든 문자가 코드 포인트 128 (0-127) 미만인지 확인합니다. 제어 문자도 피하려면 다음이 필요 text.isascii() and text.isprintable()합니다.. 그냥 사용 isprintable자체 것은 ¿ 같은 문자가 (제대로) 인쇄로 간주되므로, 충분한 또한,하지만 당신은 모두 당신이 모두를 원하는 경우 확인해야합니다 그래서, 아스키 인쇄 섹션 내에 아니다. 또 다른 문제 : 공백은 인쇄 가능한 것으로 간주되며 탭과 줄 바꿈은 그렇지 않습니다.
최근에 이와 같은 문제가 발생했습니다. 나중에 참조 할 수 있습니다.
import chardet
encoding = chardet.detect(string)
if encoding['encoding'] == 'ascii':
print 'string is in ascii'
당신이 함께 사용할 수있는 :
string_ascii = string.decode(encoding['encoding']).encode('ascii')
{'confidence': 0.99, 'encoding': 'EUC-JP'}(이 경우에는 완전히 틀 렸습니다)
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.
유니 코드 용어집 은 각 특정 용어가 텍스트 표현의 다른 부분을 어떻게 나타내는지를 지적함으로써 이러한 문제 중 일부를 이해하는 데 유용한 안내서가 될 수 있습니다. 이는 많은 프로그래머가 인식하는 것보다 훨씬 복잡합니다.
인코딩이 확실하지 않은 문자열을 사용 / 인코딩 / 디코딩하는 방법 (및 해당 문자열의 특수 문자를 이스케이프 / 변환하는 방법)을 결정하는 동안이 질문을 발견했습니다.
첫 번째 단계는 문자열 유형을 확인하는 것이 었습니다. 유형에서 형식에 대한 좋은 데이터를 얻을 수 있다는 것을 알지 못했습니다. 이 답변은 매우 도움이되었고 내 문제의 근원에 도달했습니다.
무례하고 끈질긴 경우
UnicodeDecodeError : 'ascii'코덱이 263 위치에서 바이트 0xc3을 디코딩 할 수 없습니다 : 서 수가 범위 내에 있지 않습니다 (128)
특히 인코딩 할 때 어떤 끔찍한 이유로 이미 유니 코드 인 문자열을 유니 코드 ()하려고 시도하지 마십시오. 아스키 코덱 오류가 발생합니다. ( Python Kitchen 레시피 및 Python 문서 도 참조하십시오. 자습서를 이것이 얼마나 끔찍한 지 이해하십시오.)
결국 나는 내가하고 싶은 것이 이것이라고 결정했다.
escaped_string = unicode(original_string.encode('ascii','xmlcharrefreplace'))
디버깅에 도움이되는 것은 내 파일의 기본 코딩을 utf-8로 설정하는 것입니다 (파이썬 파일의 시작 부분에 넣으십시오).
# -*- coding: utf-8 -*-
따라서 유니 코드 이스케이프 (u '\ xe0 \ xe9 \ xe7')를 사용하지 않고도 특수 문자 ( 'àéç')를 테스트 할 수 있습니다.
>>> specials='àéç'
>>> specials.decode('latin-1').encode('ascii','xmlcharrefreplace')
'àéç'
Python 2.6 (및 Python 3.x)에서 Alexander의 솔루션을 개선하기 위해 헬퍼 모듈 curses.ascii를 사용하고 curses.ascii.isascii () 함수 또는 기타 여러 가지를 사용할 수 있습니다. https://docs.python.org/2.6/ library / curses.ascii.html
from curses import ascii
def isascii(s):
return all(ascii.isascii(c) for c in s)
코드 충돌을 방지하기 위해 a try-except를 사용하여TypeErrors
>>> ord("¶")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found
예를 들어
def is_ascii(s):
try:
return all(ord(c) < 128 for c in s)
except TypeError:
return False
try포장지는 완전히 무의미합니다. 경우 "¶"유니 코드 문자열은 다음 ord("¶")작동합니다, 그것은 (파이썬 2)이 아니라면, for c in s그래서 바이트로 분해됩니다 ord계속 작동합니다.
문자열을 ASCII 또는 유니 코드인지 확인하려면 다음을 사용하십시오.
>> print 'test string'.__class__.__name__
str
>>> print u'test string'.__class__.__name__
unicode
>>>
그런 다음 조건부 블록을 사용하여 함수를 정의하십시오.
def is_ascii(input):
if input.__class__.__name__ == "str":
return True
return False
is_ascii(u'i am ascii').. 문자와 공백이 ASCII 인 경우에도 False문자열을 강제 로 했기 때문에 여전히 반환 unicode됩니다.