답변:
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"
str
Python 2, bytes
Python 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
isascii
isascii('somestring')
True
isascii('àéç')
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
됩니다.