2011-03-31 3 views
1

사용하려고하면 "UnicodeDecodeError : 'shift_jis'코덱에서 2-3 위치의 바이트를 디코딩 할 수 없습니다 : 멀티 바이트 시퀀스가 ​​아닙니다. 내 이메일 파서가 shift_jis로 인코딩 된 이메일을 디코딩하고 유니 코드로 변환합니다. 코드 및 이메일 아래에 찾을 수 있습니다인코딩이 Shift_jis 일 때 Python의 전자 메일 모듈을 사용하여 전자 메일을 구문 분석하는 동안 오류가 발생했습니다.

import email.header 
import base64 
import sys 
import email 

def getrawemail(): 
    line = ' ' 
    raw_email = '' 
    while line: 
     line = sys.stdin.readline() 
     raw_email += line 
    return raw_email 

def getheader(subject, charsets): 
    for i in charsets: 
     if isinstance(i, str): 
      encoding = i 
      break 
    if subject[-2] == "?=": 
     encoded = subject[5 + len(encoding):len(subject) - 2] 
    else: 
     encoded = subject[5 + len(encoding):] 
    return (encoding, encoded) 

def decodeheader((encoding, encoded)): 
    decoded = base64.b64decode(encoded) 
    decoded = unicode(decoded, encoding) 
    return decoded 

raw_email = getrawemail() 
msg = email.message_from_string(raw_email) 
subject = decodeheader(getheader(msg["Subject"], msg.get_charsets())) 
print subject 

이메일 :이 유니 코드 및 SHIFT_JIS 인코딩하는 방법의 차이에 관련이있을 수 있습니다 또 다른 스택 오버플로 질문에 읽고 http://pastebin.com/L4jAkm5R

(그들은 this를 참조 Microsoft 기술 자료 문서). 누군가 내 코드에서 무엇이 작동하지 않는지 알거나, 심지어 이것이 고칠 수있는 것이라면 어떻게하는지 알아내는 것이 좋습니다.

답변

1

문자열로부터 시작

In [124]: msg['Subject'] 
Out[124]: '=?ISO-2022-JP?B?GyRCNS5KfSRLJEgkRiRiQmdAWiRKJCpDTiRpJDskLCQiJGo' 

=?ISO-2022-JP?B? 문자열을 의미하는 ISO-2022-JP는,베이스 64 부호화 된 부호화된다.

In [125]: msg['Subject'].lstrip('=?ISO-2022-JP?B?') 
Out[125]: 'GyRCNS5KfSRLJEgkRiRiQmdAWiRKJCpDTiRpJDskLCQiJGo' 

불행하게도, 오류가 그 처리 결과 반전을 시도 : '? ='

In [130]: print(base64.b64decode(msg['Subject'].lstrip('=?ISO-2022-JP?B?')+'?=').decode('ISO-2022-JP')) 
貴方にとても大切なお知らせがあり 
SO answer 읽기

In [126]: base64.b64decode(msg['Subject'].lstrip('=?ISO-2022-JP?B?')) 
TypeError: Incorrect padding 

문자열의 끝에 추가하려고 저를 이끌어

구글 번역에 따르면, 이것은 "매우 중요하다는 것을 안다"라고 번역 될 수 있습니다.

제목 줄이 잘 렸습니다.

관련 문제