문제

나는 str/unicode decode와 encode의 차이를 이해한다고 확신하지 못했습니다.

나는 그것을 알고있다 str().decode() 인코딩 이름이 유니 코드 문자열을 반환 할 때 특정 문자 인코딩을 가지고있는 바이트 문자열이있을 때입니다.

나는 그것을 알고있다 unicode().encode() 주어진 인코딩 이름에 따라 유니 코드 숯을 바이트 문자열로 변환합니다.

그러나 나는 무엇을 이해하지 못한다 str().encode() 그리고 unicode().decode() . 누구든지 설명 할 수 있고 아마도 내가 위에서 잘못했던 것을 바로 잡을 수 있습니까?

편집하다:

몇 가지 답변은 무엇에 대한 정보를 제공합니다 .encode 끈으로 사용하지만 아무도 무엇을 아는 사람이 없습니다. .decode 유니 코드를 위해합니다.

도움이 되었습니까?

해결책

그만큼 decode 유니 코드 문자열의 방법에는 실제로 어떤 응용 프로그램이 없습니다 (어떤 이유로 든 유니 코드 문자열에 비 텍스트 데이터가없는 한-아래 참조). 그것은 주로 역사적 이유로 거기에 있다고 생각합니다. 파이썬 3에서는 완전히 사라졌습니다.

unicode().decode() 암시 적을 수행합니다 부호화s 기본 (ASCII) 코덱 사용. 그렇게 확인하십시오.

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

오류 메시지는 정확히 동일합니다.

을 위한 str().encode() 그것은 다른 방법입니다 - 그것은 암시 적을 시도합니다 디코딩s 기본 인코딩으로 :

>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
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)

이렇게 사용 str().encode() 또한 불필요합니다.

하지만 후자의 방법에 대한 또 다른 적용이 있습니다. 인코딩 캐릭터 세트와 관련이 없으므로 의미있는 방식으로 8 비트 문자열에 적용 할 수 있습니다.

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

그래도 당신이 옳습니다.이 두 응용 프로그램에 대한 "인코딩"의 모호한 사용은 ... awkard입니다. 다시, 별도 byte 그리고 string Python 3의 유형은 더 이상 문제가되지 않습니다.

다른 팁

바이트 문자열로 유니 코드 문자열을 나타내는 것은 부호화. 사용 u'...'.encode(encoding).

예시:

    >>> u'æøå'.encode('utf8')
    '\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5'
    >>> u'æøå'.encode('latin1')
    '\xc3\xa6\xc3\xb8\xc3\xa5'
    >>> u'æøå'.encode('ascii')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: 
    ordinal not in range(128)

일반적으로 IO에 사용할 때마다 유니 코드 문자열을 인코딩하고, 예를 들어 네트워크로 전송하거나 디스크 파일에 저장합니다.

바이트 문자열을 유니 코드 문자열로 변환하는 것은 다음과 같습니다. 디코딩. 사용 unicode('...', encoding) 또는 '...'. Decode (인코딩).

예시:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so
   >>> unicode('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'
   >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'

일반적으로 네트워크 나 디스크 파일에서 문자열 데이터를 수신 할 때마다 바이트 문자열을 디코딩합니다.

Python 3에는 유니 코드 처리에 약간의 변화가 있다고 생각합니다. 따라서 위는 아마도 Python 3에 맞지 않을 것입니다.

몇 가지 좋은 링크 :

anunicode.인코딩( '인코딩') 결과 a 객체이며 유니 코드 객체에서 호출 될 수 있습니다

수술.풀다( '인코딩') 결과 유니 코드 주어진 인코딩으로 인코딩 된 문자열로 호출 할 수 있습니다.


더 많은 설명 :

인코딩 세트가없는 유니 코드 객체를 만들 수 있습니다. 메모리에서 Python에 의해 저장되는 방식은 당신의 관심사가 아닙니다. 당신은 그것을 검색하고, 분할하고, 당신이 원하는 문자열 조작 기능을 호출 할 수 있습니다.

그러나 유니 코드 객체를 콘솔이나 일부 텍스트 파일에 인쇄하고 싶을 때가 있습니다. 그래서 당신은해야합니다 인코딩 예를 들어 (예 : UTF-8) Encode ( 'UTF-8')를 호출하고 ' u가있는 문자열을 얻습니다.u003CsomeNumber> '내부, 완벽하게 인쇄 할 수 있습니다.

그런 다음 다시 - 당신은 반대를하고 싶습니다 - UTF -8에서 인코딩 된 문자열을 읽고 유니 코드로 취급하십시오. u360은 5가 아닌 하나의 문자가 될 것입니다. 풀다 문자열 (선택한 인코딩 포함) 및 유니 코드 유형의 새로운 객체를 얻습니다.

부수적 노트와 마찬가지로 'zip', 'base64', 'rot'와 같은 변형 인코딩을 선택할 수 있으며 일부는 문자열에서 문자열로 변환하지만 가장 일반적인 경우는 UTF -8을 포함하는 것입니다. /UTF-16 및 문자열.

mybytestring.encode (somecodec)는 이러한 값에 의미가 있습니다. somecodec:

  • 베이스 64
  • BZ2
  • zlib
  • 마녀
  • Quopri
  • rot13
  • String_escape
  • UU

이미 디코딩 된 유니 코드 텍스트를 디코딩하는 것이 좋은지 잘 모르겠습니다. 인코딩으로 시도해 보는 것은 항상 시스템의 기본 인코딩을 먼저 인코딩하려고 시도하는 것 같습니다.

당신은 읽어야합니다 Python unicodedecodeerror- 인코딩을 오해하고 있습니다. 파이썬에서 유니 코드에 대한 나의 이해는 허용 된 답변을 읽은 후 훨씬 더 명확했습니다.

STR에서 STR까지 또는 유니 코드에서 유니 코드로 인코딩하는 데 사용될 수있는 몇 가지 인코딩이 있습니다. 예를 들어 Base64, 16 진수 또는 ROT13. 그들은에 나열되어 있습니다 코덱 모듈.

편집하다:

유니 코드 문자열의 디코드 메시지는 해당 인코딩 작업을 취소 할 수 있습니다.

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

반환 된 유형은 유니 코드 대신 STR이며 불행한 내 의견으로는 불행합니다. 그러나 str과 unicode 사이에 적절한 en-/decode를하지 않을 때는 어쨌든 엉망인 것처럼 보입니다.

간단한 대답은 그들이 서로 정반대라는 것입니다.

컴퓨터는 기본적인 바이트 단위를 사용하여 정보를 저장하고 처리합니다. 인간의 눈에는 의미가 없습니다.

예를 들어, ' xe4 xb8 xad xe6 xe6 x96 x87'은 두 중국어의 표현이지만 컴퓨터는 (인쇄 또는 저장) 만 알고 있습니다. 중국어 단어,이 경우에는 "UTF-8"사전이며, 다른 사전 (다른 디코딩 방법을 사용하여)을 보면 의도 된 중국어 단어를 올바르게 보여주지 못할 것입니다.

위의 경우, 컴퓨터가 중국어 단어를 찾는 프로세스는 디코딩 ()입니다.

컴퓨터를 컴퓨터 메모리에 쓰는 컴퓨터 프로세스는 encode ()입니다.

따라서 인코딩 정보는 원시 바이트이며 디코딩 된 정보는 원시 바이트와 참조 사전의 이름 (사전 자체가 아님)입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top