다음과 같은 유사한 코드를 실행하세요.
#!/usr/bin/env python s="中文" print s
최근에 이 문제가 자주 발생합니다. >
질문 1: 구문 오류: E:codingpythonUntitled 6.py 파일의 3행에 비ASCII 문자 'xe4'가 있지만 인코딩이 선언되지 않았습니다. 자세한 내용은 http://www.python.org/peps/pep-0263을 참조하세요. 🎜>질문 2: UnicodeDecodeError: 'ascii' 코덱은 위치 108의 바이트 0xe5를 디코딩할 수 없습니다: 서수는 범위(128)에 없습니다.
질문 3: UnicodeEncodeError: 'gb2312' 코덱은 인코딩할 수 없습니다. 위치 72366의 문자 u'u2014: 잘못된 멀티바이트 시퀀스
이것들은 모두 문자 인코딩과 관련된 문제입니다. 매우 실망스럽습니다. 여기에서 많은 해결책을 찾았습니다. 몇 가지 제가 며칠 전에 찾은 몇 가지 솔루션을 여러분과 공유하겠습니다
Python에서 문자열의 내부 표현은 유니코드 인코딩입니다. 따라서 인코딩 변환을 수행할 때 일반적으로 중간 인코딩으로 유니코드가 필요합니다. 먼저 다른 인코딩의 문자열을 유니코드로 디코딩한 다음 이를 유니코드에서 다른 인코딩으로 인코딩합니다.
decode의 기능은 다른 인코딩된 문자열을 str1.decode('gb2312')와 같은 유니코드 인코딩으로 변환하는 것입니다. 이는 gb2312로 인코딩된 문자열 str1을 유니코드 인코딩으로 변환하는 것을 의미합니다.
인코드 기능은 유니코드 인코딩을 str2.encode('gb2312')와 같은 다른 인코딩된 문자열로 변환하는 것입니다. 이는 유니코드 인코딩 문자열 str2를 gb2312 인코딩으로 변환하는 것을 의미합니다.
일부 IDE에서는 문자열 출력이 항상 깨져서 나타나거나 오류가 발생하기도 합니다. 이는 실제로 프로그램 자체의 문제가 아니라 IDE의 결과 출력 콘솔 자체가 문자열 인코딩을 표시할 수 없기 때문입니다.
UliPad에서 다음 코드를 실행하면:
s=u"中文"
print s
는 다음 메시지를 표시합니다: UnicodeEncodeError: 'ascii' codec 0-1 위치의 문자를 인코딩할 수 없습니다. 범위(128)에 없는 서수입니다. 울리패드의 콘솔 정보 출력창이 영문 윈도우이기 때문입니다.
마지막 문장을 다음으로 변경하세요: print s.encode('gb2312')
"중국어"라는 단어가 올바르게 출력될 수 있습니다.
마지막 문장을 print s.encode('utf8')
으로 변경하면 xe4xb8xadxe6x96x87이 출력됩니다. utf8을 출력하는 콘솔 정보 출력 창의 결과입니다. -ASCII 인코딩에 따라 인코딩된 문자열입니다.
다음 코드는 다음과 같이 더 일반적일 수 있습니다.
#!/usr/bin/env python #coding=utf-8 s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312') #!/usr/bin/env python #coding=utf-8 s="中文" if isinstance(s, unicode): #s=u"中文" print s.encode('gb2312') else: #s="中文" print s.decode('utf-8').encode('gb2312')
다음을 살펴보세요. 다음 코드 조각 :
#!/usr/bin/env python #coding=utf-8 #python version:2.7.4 #system:windows xp import httplib2 def getPageContent(url): ''''' 使用httplib2用编程的方式根据url获取网页内容 将bytes形式的内容转换成utf-8的字符串 ''' #使用ie9的user-agent,如果不设置user-agent将会得到403禁止访问 headers={'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'cache-control':'no-cache'} if url: response,content = httplib2.Http().request(url,headers=headers) if response.status == 200 : return content
import sys reload(sys) sys.setdefaultencoding('utf-8') #修改默认编码方式,默认为ascci print sys.getdefaultencoding() content = getPageContent("http://www.oschina.net/") print content.decode('utf-8').encode('gb2312') #!/usr/bin/env python #coding=utf-8 #python version:2.7.4 #system:windows xp import httplib2 def getPageContent(url): ''' 使用httplib2用编程的方式根据url获取网页内容 将bytes形式的内容转换成utf-8的字符串 ''' #使用ie9的user-agent,如果不设置user-agent将会得到403禁止访问 headers={'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'cache-control':'no-cache'} if url: response,content = httplib2.Http().request(url,headers=headers) if response.status == 200 : return content
import sys reload(sys) sys.setdefaultencoding('utf-8') #修改默认编码方式,默认为ascci print sys.getdefaultencoding() content = getPageContent("http://www.oschina.net/") print content.decode('utf-8').encode('gb2312')
위 코드의 의미: www.oschina.net 웹사이트에서 홈페이지를 요청합니다(utf인 경우). -8 인코딩 직접, 중국어 출력 불가) 인코딩 방식을 utf-8에서 gd2312로 변경하고 싶은데 3번 문제 발생
print content.decode('utf-8').encode( 'gb2312')를 출력하려면 content.decode('utf-8').encode('gb2312', 'ignore') 하면 괜찮고 중국어도 표시가 되지만 전부인지는 잘 모르겠네요. 일부는 gb2312로 인코딩할 수 없습니다
그러나 웹사이트를 www.soso.com으로 변경하면 gb2312로 변환할 필요 없이 utf-8을 사용하여 표시할 수 있습니다. 중국어는 보통
요약하자면
파일을 ss로 직접 출력하면 동일한 예외가 발생합니다. 유니코드 중국어 문자열을 처리할 때 먼저 해당 문자열에 대해 encode 함수를 호출하여 다른 인코딩 출력으로 변환해야 합니다. 이는 모든 환경에 해당됩니다. Python에서 "str" 객체는 바이트 배열입니다. 내부 내용이 유효한 문자열인지 또는 문자열이 어떤 인코딩(gbk, utf-8, unicode)을 사용하는지 여부는 중요하지 않습니다. 이러한 콘텐츠는 사용자가 직접 기록하고 판단해야 합니다. 이러한 제한 사항은 "유니코드" 개체에도 적용됩니다. 곧 살펴보겠지만 "유니코드" 객체의 내용이 반드시 유효한 유니코드 문자열일 필요는 없다는 점을 명심하세요. Windows 콘솔에서는 gbk로 인코딩된 str 개체와 유니코드로 인코딩된 유니코드 개체가 지원됩니다.