source

Python 문자열이 ASCII로 되어 있는지 확인하는 방법

nicesource 2022. 11. 4. 21:24
반응형

Python 문자열이 ASCII로 되어 있는지 확인하는 방법

문자열이 ASCII로 되어 있는지 확인하고 싶습니다.

알고 있다ord()하지만 막상 해보니ord('é'),있습니다TypeError: ord() expected a character, but string of length 2 foundPython의 작성 방법(의 설명대로)에 의한 것임을 알았습니다.

확인할 다른 방법이 있나요?

내 생각엔 네가 옳은 질문을 하고 있지 않은 것 같은데..

python 문자열에는 'asciii', utf-8 또는 다른 인코딩에 해당하는 속성이 없습니다.문자열의 소스(파일에서 읽든 키보드에서 입력하든 상관없이)는 문자열을 생성하기 위해 유니코드 문자열을 ASCII로 인코딩했을 수 있지만, 여기서 답을 찾아야 합니다.

아마도 다음과 같은 질문을 할 수 있습니다. "이 문자열은 asciii에서 유니코드 문자열을 인코딩한 결과입니까?" 이 질문은 다음과 같이 대답할 수 있습니다.

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"
def is_ascii(s):
    return all(ord(c) < 128 for c in s)

Python 3에서는 문자열을 UTF-8로 인코딩하여 길이가 동일한지 여부를 확인할 수 있습니다.이 경우 원래 문자열은 ASCII입니다.

def isascii(s):
    """Check if the characters in string s are in ASCII, U+0-U+7F."""
    return len(s) == len(s.encode())

확인하려면 테스트 문자열을 전달합니다.

>>> isascii("♥O◘♦♥O◘♦")
False
>>> isascii("Python")
True

Python 3.7의 새로운 기능(bpo32677)

문자열에 대한 번거롭고 비효율적인 ASCII 체크가 필요 없어지고 새로운 내장str/bytes/bytearraymethod - 문자열이 ASCII인지 확인합니다.

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

빈센트 마체티는 좋은 생각이지만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.

질문은 틀렸습니다.이 에러는 python을 어떻게 구축했는지에 의한 것이 아니라 바이트 문자열과 유니코드 문자열의 혼동에 의한 것입니다.

바이트 문자열(예를 들어 python 구문에서 foo 또는 bar)은 옥텟의 시퀀스이며 0 ~255의 숫자입니다.유니코드 문자열(예: u"foo" 또는 u'bar')은 유니코드 코드 포인트의 시퀀스이며 0 ~1112064의 숫자입니다.단, (단말기에서) 단일 문자를 나타내는 멀티바이트 시퀀스인 문자e에 관심이 있는 것 같습니다.

대신ord(u'é'), 이것을 시험해 보세요.

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

코드 포인트 "e"가 어떤 시퀀스를 나타내는지 알 수 있습니다.[233]을 얻을 수도 있고 [101, 770]을 얻을 수도 있습니다.

대신chr()이것을 되돌리기 위해서,unichr():

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

이 문자는 실제로는 1개 또는 복수의 유니코드 「코드 포인트」를 나타낼 수 있습니다.이것들은, 그 자체가 자모 또는 문자를 나타냅니다."e" 또는 "e" (코드 포인트 233) 또는 "e" (코드 포인트 101)에 이어 "이전 문자의 급성 포인트"(코드 포인트 770)가 됩니다.따라서 이 문자는 Python 데이터 구조와 정확히 일치할 수 있습니다.u'e\u0301' ★★★★★★★★★★★★★★★★★」u'\u00e9'.

대부분의 경우 이 문제는 신경 쓰지 않아도 되지만, Unicode 문자열로 반복할 경우 분해 가능한 문자가 아닌 코드 포인트로 반복하기 때문에 문제가 될 수 있습니다. 말하면, 「 」입니다.len(u'e\u0301') == 2 ★★★★★★★★★★★★★★★★★」len(u'\u00e9') == 1이것이 중요한 경우 를 사용하여 컴포지트 폼과 분해 폼을 변환할 수 있습니다.

Unicode 용어집은 각 특정 용어가 텍스트 표현의 다른 부분을 어떻게 참조하는지 설명함으로써 이러한 문제의 일부를 이해하는 데 도움이 될 수 있습니다.이것은 많은 프로그래머들이 알고 있는 것보다 훨씬 더 복잡합니다.

최근에 이와 같은 것을 발견 - 나중에 참조할 수 있습니다.

import chardet

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

사용할 수 있습니다.

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

이렇게 하는 게 어때?

import string

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

이 질문은 인코딩이 불분명한 문자열의 사용/encode/복호화 방법(및 해당 문자열의 특수 문자를 이스케이프/변환하는 방법)을 결정하던 중 발견되었습니다.

첫 번째 단계는 문자열의 유형을 확인하는 것이어야 했는데, 형식에서 좋은 데이터를 얻을 수 있는지 몰랐습니다.이 답변은 매우 도움이 되었고 제 문제의 진정한 근원을 밝혀냈습니다.

무례하고 집요하게 굴면

UnicodeDecodeError: 'ascii' 코덱이 위치 263에서 바이트 0xc3을 디코딩할 수 없음: 서수가 범위 내에 없음(128)

특히 인코딩을 할 때는 이미 IS가 유니코드인 문자열을 Unicode()하려고 하지 마십시오.어떤 끔찍한 이유로 인해 ASCII 코덱 오류가 발생합니다.(이것이 얼마나 끔찍한지에 대한 자세한 내용은 Python Kitchen 레시피와 Python 문서 튜토리얼을 참조하십시오.)

결국 저는 이렇게 하기로 결심했습니다.

escaped_string = unicode(original_string.encode('ascii','xmlcharrefreplace'))

디버깅에 도움이 되는 것은 파일 내의 디폴트코딩을 utf-8로 설정하는 것입니다(이것을 python 파일의 선두에 둡니다).

# -*- 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 솔루션을 개선하려면 도우미 모듈 curs.asciii를 사용하고 curs.asciii() 함수 또는 다양한 기타 기능을 사용합니다.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)은 Python에서 일련의 바이트입니다.이 일련의 바이트가 ASCII 스트링인지 ISO-8859-1과 같은8비트 문자 집합의 스트링인지 UTF-8 또는 UTF-16으로 인코딩된 스트링인지 스트링인지 여부를 스트링만 보면 알 수 없습니다.

사용하는 있는 는, 「」를 할 수 .decode유니코드 문자열에 스트링을 입력한 후 정규 표현(또는 루프)을 사용하여 관심 범위를 벗어나는 문자가 포함되어 있는지 확인합니다.

@RogerDahl의 답변처럼 문자 클래스를 부정하고 대신 검색을 사용하여 단락하는 것이 더 효율적입니다.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

정규 표현은 이 경우에 최적화되어 있다고 생각합니다.

import re

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

하려면 , 「ASCII」를 합니다.+로로 합니다.*.

크래시를 하려면 , 「」를 하는 것이 .try-exceptTypeErrors

>>> 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

문자열이 ASCII인지 Unicode인지 확인하려면 다음 명령을 사용합니다.

>> 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

언급URL : https://stackoverflow.com/questions/196345/how-to-check-if-a-string-in-python-is-in-ascii

반응형