문제

문자열이 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')

귀하의 질문이 잘못되었습니다. 당신이 보는 오류는 당신이 파이썬을 구축 한 결과가 아니라 바이트 문자열과 유니 코드 문자열 사이의 혼란의 결과입니다.

바이트 문자열 (예 : Python Syntax의 "Foo"또는 'Bar')은 옥팅 시퀀스입니다. 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'

이 문자는 실제로 단일 또는 다중 유니 코드 "코드 포인트"로 표시 될 수 있으며,이 문자는 자체적으로 그래픽 또는 문자를 나타냅니다. "급성 악센트 (즉, 코드 포인트 233)"또는 "E"(코드 포인트 101)가있는 다음 "이전 문자의 급성 악센트"(코드 포인트 770)입니다. 따라서이 동일한 문자는 파이썬 데이터 구조로 제시 될 수 있습니다. u'e\u0301' 또는 u'\u00e9'.

대부분의 경우이를 신경 쓰지 않아도되지만 반복이 분해 가능한 문자가 아니라 코드 포인트별로 작동하기 때문에 유니 코드 문자열을 반복하는 경우 문제가 될 수 있습니다. 다시 말해, len(u'e\u0301') == 2 그리고 len(u'\u00e9') == 1. 이것이 당신에게 중요한 경우, 당신은 unicodedata.normalize.

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

이 작업은 어떻습니까?

import string

def isAscii(s):
    for c in s:
        if c not in string.ascii_letters:
            return False
    return True

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.

인코딩을 사용하는 방법 (그리고 해당 문자열에서 특수 문자를 탈출/변환하는 방법)을 사용하는 방법을 결정하는 동안이 질문을 찾았습니다.

첫 번째 단계는 문자열의 유형을 확인하는 것이어야했습니다. 유형에서 형식에 대한 좋은 데이터를 얻을 수 있다는 것을 알지 못했습니다. 이 답변은 매우 도움이되었고 내 문제의 실제 근본에 도달했습니다.

무례하고 끈기있는 경우

UnicodedEcodeerror : 'ASCII'코덱은 위치 263에서 바이트 0xc3을 디코딩 할 수 없습니다.

특히 인코딩 할 때, 끔찍한 이유 때문에 이미 유니 코드 인 문자열을 유니 코드 ()하려고하지 않도록하십시오. (또한 참조 파이썬 주방 레시피, 그리고 파이썬 문서 이것이 얼마나 끔찍한지를 더 잘 이해하기위한 튜토리얼.)

결국 나는 내가하고 싶은 것이 이것이라고 결정했다.

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')
'&#224;&#233;&#231;'

Python 2.6 (및 Python 3.x)에서 Alexander의 솔루션을 개선하려면 Helper Module 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)

POSIX 표준 [[: ASCII :]] 정의를 받아들이는 정규식 라이브러리를 사용할 수 있습니다.

찌르기 (str파이썬에서 -type)는 일련의 바이트입니다. 거기 있습니다 절대 안돼 이 일련의 바이트가 ASCII 문자열, ISO-8859-1과 같은 8 비트 숯의 문자열 또는 UTF-8 또는 UTF-16으로 인코딩 된 문자열의 문자열이 문자열을 보면서 말하는 것입니다.

그러나 사용 된 인코딩을 알고 있다면 decode STR은 유니 코드 문자열에 들어간 다음 정규 표현식 (또는 루프)을 사용하여 우려하는 범위 외부에 문자가 포함되어 있는지 확인하십시오.

@rogerdahl 's처럼 대답 그러나 캐릭터 클래스를 부정하고 검색을 사용하여 단락하는 것이 더 효율적입니다. find_all 또는 match.

>>> import re
>>> re.search('[^\x00-\x7F]', 'Did you catch that \x00?') is not None
False
>>> re.search('[^\x00-\x7F]', 'Did you catch that \xFF?') is not None
True

나는 이것을 위해 정규 표현이 잘 최적화되어 있다고 생각합니다.

코드가 충돌하는 것을 방지하려면 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
import re

def is_ascii(s):
    return bool(re.match(r'[\x00-\x7F]+$', s))

빈 문자열을 ASCII로 포함 시키려면 + 에게 *.

문자열이 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top