Python - 'ascII' 코덱에서 바이트를 디코딩할 수 없음
정말 혼란스럽다.인코딩을 하려고 했는데 오류에 의해can't decode...
.
>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
나는 문자열의 "u" 접두사로 오류를 피하는 방법을 알고 있다.나는 단지 왜 인코드가 호출되었을 때 에러가 "디코딩할 수 없는" 것인지 궁금할 뿐이다.Python은 비밀리에 무엇을 하고 있는가?
"你好".encode('utf-8')
encode
유니코드 객체를 a로 변환하다string
이의를 제기하다하지만 여기서 당신은 그것을 호출했다.string
(u가 없기 때문에)그래서 python은 변환을 해야한다.string
완전히unicode
먼저 반대하다그래서 그것은 다음과 같은 일을 한다.
"你好".decode().encode('utf-8')
그러나 이 문자열은 유효한 아스키가 아니기 때문에 디코딩이 실패한다.그래서 해독을 못 한다는 불만이 나오는 겁니다.
유니코드에서 바이트로 항상 인코딩하십시오.
이 방향에서 인코딩을 선택하게 된다.
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
다른 방법은 바이트에서 유니코드로 디코딩하는 것이다.
이 방향에서는 인코딩이 무엇인지 알아야 한다.
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
이 점은 충분히 강조할 수 없다.만약 유니코드 "wack-a-mole"이 재생되는 것을 피하고 싶다면, 데이터 수준에서 무슨 일이 일어나고 있는지 이해하는 것이 중요하다.여기서 그것은 다른 방법으로 설명된다.
- 유니코드 객체가 이미 디코딩되었으므로 호출할 필요 없음
decode
그 위에 - 테스트 대상 개체가 이미 인코딩되어 있으므로 절대 호출하지 마십시오.
encode
그 위에
자, 보자면.encode
바이트 문자열에서 Python 2는 먼저 그것을 텍스트로 암묵적으로 변환하려고 시도한다(aunicode
목적어)이와 유사하게,.decode
유니코드 문자열에서 Python 2는 암시적으로 바이트로 변환하려고 시도한다(astr
목적어)
이런 암묵적인 전환이 당신이 얻을 수 있는 이유다.Unicode
Decode
Error
당신이 전화했을 때왜냐하면 인코딩은 보통 유형의 매개 변수를 허용하기 때문이다.unicode
을 때str
매개 변수, 유형 객체로 암시적으로 디코딩하는 경우unicode
다른 인코딩으로 다시 설정하기 전에.이 변환은 인코더 내부의 디코딩 오류를 제공하는 기본 'ascII' 디코더를† 선택한다.
사실 파이톤 3에서는 그 방법들이str.decode
그리고bytes.encode
존재하지도 않는다.그들의 제거는 이런 일반적인 혼란을 피하기 위한[논쟁적인] 시도였다.
† 이든...혹은 어떤 코딩이든sys.getdefaultencoding()
언급; 보통 이것은 'ascII'이다.
이거 먹어봐.
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
아니면
다음 작업을 시도해 보십시오.
.py 파일 상단에 다음 줄을 추가하십시오.
# -*- coding: utf-8 -*-
Python < 3을 사용하는 경우, 당신은 당신의 문자열 리터럴이 유니코드라고 통역사에게 말할 필요가 있을 것이다.
Python 2.7.2 (default, Jan 14 2012, 23:14:09)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
자세한 내용:유니코드 HowTO.
당신이 사용하는 것은u"你好".encode('utf8')
유니코드 문자열을 인코딩한다.하지만 당신이 대변하고 싶다면"你好"
암호를 해독해야 해다음과 같다:
"你好".decode("utf8")
원하는 것을 얻을 수 있을 것이다.아마도 당신은 암호화와 디코딩에 대해 더 배워야 할 것이다.
유니코드를 다루는 경우, 때로는 대신encode('utf-8')
, 당신은 또한 특별한 캐릭터들을 무시하려고 노력할 수 있다.
"你好".encode('ascii','ignore')
또는 여기에 제시된 대로.
이 예에서는 특별히 유용하지는 않지만, 일부 특수 문자를 변환할 수 없는 경우에는 다른 시나리오에서 더 효과적일 수 있다.
또는 를 사용하여 특정 문자를 바꾸는 것을 고려해 보십시오.
Linux 또는 유사한 시스템(BSD, Mac에 대한 확신 없음)의 셸에서 python 인터프리터를 시작하는 경우 셸의 기본 인코딩도 확인하십시오.
부르다locale charmap
조개껍데기(파이톤 통역기가 아님)에서, 그리고 당신은 봐야 한다.
[user@host dir] $ locale charmap
UTF-8
[user@host dir] $
예를 들어, 만약 이것이 사실이 아니라면, 당신은 다른 것을 보게 될 것이다.
[user@host dir] $ locale charmap
ANSI_X3.4-1968
[user@host dir] $
파이톤은 (적어도 내 것과 같은 경우에) 셸의 인코딩을 상속받아서 (일부? 모두?) 유니코드 문자를 인쇄할 수 없을 것이다.보고 제어하는 Python의 기본 인코딩sys.getdefaultencoding()
그리고sys.setdefaultencoding()
이 경우에는 무시된다.
만약 당신이 이 문제를 발견한다면, 당신은 그것을 해결 할 수 있다.
[user@host dir] $ export LC_CTYPE="en_EN.UTF-8"
[user@host dir] $ locale charmap
UTF-8
[user@host dir] $
(또는 en_EN 대신 원하는 키맵을 선택하십시오.) 편집도 가능하다./etc/locale.conf
(또는 시스템에서 로케일 정의를 제어하는 파일)을 수정하기 위해
참조URL: https://stackoverflow.com/questions/9644099/python-ascii-codec-cant-decode-byte
'Programing' 카테고리의 다른 글
rxjs 관측 가능성과 일반 반응 구성요소를 통합하려면 어떻게 해야 하는가? (0) | 2022.03.17 |
---|---|
Vue 앱(Vuetify.js 포함)에서 검증이 포함된 간단한 양식을 구현하는 방법 (0) | 2022.03.17 |
Python 3에서 Raw_input을 사용하는 방법 (0) | 2022.03.17 |
주의 일부만 업데이트할 때 상태를 얼마나 깊이 복제해야 하는가? (0) | 2022.03.17 |
Windows에서 여러 Python 버전을 실행하는 방법 (0) | 2022.03.16 |