[python] 문자열이 유니 코드인지 아스키인지 어떻게 확인합니까?

문자열에 어떤 인코딩이 있는지 알아 내기 위해 파이썬에서 무엇을해야합니까?



답변

Python 3에서 모든 문자열은 유니 코드 문자 시퀀스입니다. bytes원시 바이트를 보유 하는 유형이 있습니다.

Python 2에서 문자열은 유형 str이거나 유형일 수 있습니다 unicode. 다음과 같은 코드를 사용하여 알 수 있습니다.

def whatisthis(s):
    if isinstance(s, str):
        print "ordinary string"
    elif isinstance(s, unicode):
        print "unicode string"
    else:
        print "not a string"

이것은 “유니 코드 또는 ASCII”를 구별하지 않습니다. 파이썬 타입 만 구별합니다. 유니 코드 문자열은 ASCII 범위의 순수 문자로 구성 될 수 있으며 바이트 스트링은 ASCII, 인코딩 된 유니 코드 또는 텍스트가 아닌 데이터를 포함 할 수 있습니다.


답변

객체가 유니 코드 문자열인지 또는 바이트 문자열인지 확인하는 방법

당신은 사용할 수 있습니다 type또는 isinstance.

파이썬 2에서 :

>>> type(u'abc')  # Python 2 unicode string literal
<type 'unicode'>
>>> type('abc')   # Python 2 byte string literal
<type 'str'>

파이썬 2에서는 str바이트 시퀀스입니다. 파이썬은 인코딩이 무엇인지 모릅니다. unicode유형은 저장 텍스트 안전한 방법입니다. 이것을 더 이해하려면 http://farmdev.com/talks/unicode/를 권장 합니다.

파이썬 3에서 :

>>> type('abc')   # Python 3 unicode string literal
<class 'str'>
>>> type(b'abc')  # Python 3 byte string literal
<class 'bytes'>

Python 3에서는 Python str2와 비슷 unicode하며 텍스트를 저장하는 데 사용됩니다. 무엇 호출 된 str파이썬 2 것은이라고 bytes파이썬 3.


바이트 문자열이 유효한 UTF-8인지 또는 ASCII인지 확인하는 방법

에 전화 할 수 있습니다 decode. UnicodeDecodeError 예외가 발생하면 유효하지 않습니다.

>>> u_umlaut = b'\xc3\x9c'   # UTF-8 representation of the letter 'Ü'
>>> u_umlaut.decode('utf-8')
u'\xdc'
>>> u_umlaut.decode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)


답변

python 3.x에서 모든 문자열은 유니 코드 문자 시퀀스입니다. str에 대한 인스턴스 검사 (기본적으로 유니 코드 문자열을 의미 함)를 수행하면 충분합니다.

isinstance(x, str)

파이썬 2.x와 관련하여 대부분의 사람들은 두 가지 검사가있는 if 문을 사용하는 것 같습니다. 하나는 str, 하나는 유니 코드입니다.

하나의 명령문으로 ‘string-like’객체가 있는지 확인하려면 다음을 수행하십시오.

isinstance(x, basestring)


답변

Kumar McMillan을 인용하면 유니 코드는 인코딩이 아닙니다.

ASCII, UTF-8 및 기타 바이트 문자열이 “텍스트”인 경우 …

… 그런 다음 유니 코드는 “텍스트”입니다.

그것은 추상적 인 형태의 텍스트입니다

McMillan의 유니 코드를 읽어보십시오. PyCon 2008의 Python, Completely Demystified 강연 에서는 Stack Overflow에 대한 대부분의 관련 답변보다 훨씬 나은 점을 설명합니다.


답변

코드의 요구와 호환되는 경우 모두 파이썬이 파이썬 3, 직접 같은 것들을 사용할 수 없습니다 isinstance(s,bytes)또는 isinstance(s,unicode)때문에, 제외 또는 파이썬 버전 테스트 / 하나의 시도에 그들을 배치하지 않고 bytes파이썬 2에 정의되어 있지 및 unicode파이썬 3에서 정의되지 .

추악한 해결 방법이 있습니다. 매우 추악한 것은 유형 자체를 비교하는 대신 유형 이름 을 비교하는 것입니다. 예를 들면 다음과 같습니다.

# convert bytes (python 3) or unicode (python 2) to str
if str(type(s)) == "<class 'bytes'>":
    # only possible in Python 3
    s = s.decode('ascii')  # or  s = str(s)[2:-1]
elif str(type(s)) == "<type 'unicode'>":
    # only possible in Python 2
    s = str(s)

약간 덜 추악한 해결책은 파이썬 버전 번호를 확인하는 것입니다.

if sys.version_info >= (3,0,0):
    # for Python 3
    if isinstance(s, bytes):
        s = s.decode('ascii')  # or  s = str(s)[2:-1]
else:
    # for Python 2
    if isinstance(s, unicode):
        s = str(s)

그것들은 비유 론적이며, 대부분의 경우 더 좋은 방법이있을 것입니다.


답변

사용하다:

import six
if isinstance(obj, six.text_type)

6 개의 라이브러리 내에서 다음과 같이 표시됩니다.

if PY3:
    string_types = str,
else:
    string_types = basestring,


답변

파이썬 3에서는 다음과 같이 말하는 것이 공평하지 않습니다.

  • strs는 모든 x에 대한 UTFx입니다 (예 : UTF8)

  • strs는 유니 코드입니다

  • strs는 유니 코드 문자의 순서로 정렬됩니다.

파이썬의 str유형은 (일반적으로) 일련의 유니 코드 코드 포인트이며, 일부는 문자로 매핑됩니다.


Python 3에서도 상상할 수 있듯이이 질문에 대답하는 것은 간단하지 않습니다.

ASCII 호환 문자열을 테스트하는 확실한 방법은 인코딩을 시도하는 것입니다.

"Hello there!".encode("ascii")
#>>> b'Hello there!'

"Hello there... ☃!".encode("ascii")
#>>> Traceback (most recent call last):
#>>>   File "", line 4, in <module>
#>>> UnicodeEncodeError: 'ascii' codec can't encode character '\u2603' in position 15: ordinal not in range(128)

오류는 사례를 구별합니다.

Python 3에는 잘못된 유니 코드 코드 포인트가 포함 된 문자열도 있습니다.

"Hello there!".encode("utf8")
#>>> b'Hello there!'

"\udcc3".encode("utf8")
#>>> Traceback (most recent call last):
#>>>   File "", line 19, in <module>
#>>> UnicodeEncodeError: 'utf-8' codec can't encode character '\udcc3' in position 0: surrogates not allowed

그것들을 구별하는 동일한 방법이 사용됩니다.