문자열이 base64인지 아닌지 알리는 방법
문제
다른 소스에서 많은 이메일이 들어오고 있습니다. 그들은 모두 첨부 파일을 가지고 있으며, 많은 사람들은 중국어로 첨부 파일 이름을 가지고 있으므로이 이름은 이메일 클라이언트에 의해 Base64로 변환됩니다.
이 이메일을 받으면 이름을 해독하고 싶습니다. 그러나 Base64가 아닌 다른 이름이 있습니다. 문자열이 Base64인지 아닌지를 어떻게 구별 할 수 있습니까? Jython 프로그래밍 언어?
즉.
첫 번째 첨부 파일 :
------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
name="Copy of Book1.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="Copy of Book1.xls"
두 번째 첨부 파일 :
------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
둘 다 참고 해주세요 "컨텐츠 전송 인코딩"Base64가 있습니다
해결책
둘 다 참고하십시오
Content-Transfer-Encoding
Base64가 있습니다
이 경우 관련이 없습니다 Content-Transfer-Encoding
헤더가 아닌 바디 페이로드에만 적용됩니다.
=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=
그게 an입니다 RFC2047-인코딩 된 헤더 원자. stdlib 함수는 해독 할 수 있습니다 email.header.decode_header
. 그러나 그 기능의 결과를 해석하려면 여전히 약간의 후 처리가 필요합니다.
import email.header
x= '=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?='
try:
name= u''.join([
unicode(b, e or 'ascii') for b, e in email.header.decode_header(x)
])
except email.Errors.HeaderParseError:
pass # leave name as it was
하지만...
Content-Type: application/vnd.ms-excel;
name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
이것은 단순히 잘못입니다. 어떤 Mailer가 만들었습니까? RFC2047 인코딩은 원자에서만 발생할 수 있으며, 인용 된 스트링은 원자가 아닙니다. RFC2047 §5는 이것을 명시 적으로 거부합니다.
- '인코딩 된 단어'는 '인용문'내에 나타나지 않아야합니다.
긴 문자열 또는 유니 코드 문자가있을 때 매개 변수 헤더를 인코딩하는 허용되는 방법은 RFC2231, 그것은 완전히 새로운 상처의 가방입니다. 그러나 당신은 당신을 위해 그것에 대처할 표준 우편 준비 라이브러리를 사용해야합니다.
그래서 당신은 그것을 감지 할 수 있습니다 '=?'
원하는 경우 파일 이름 매개 변수에서 RFC2047을 통해 해독하려고합니다. 그러나 엄격하게 말하는 일은 메일러를 그 단어로 가져 가서 실제로 파일을 호출하는 것입니다. =?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=
!
다른 팁
헤더 값은 다음을 알려줍니다.
=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?= "=?" introduces an encoded value "gb2312" denotes the character encoding of the original value "B" denotes that B-encoding (equal to Base64) was used (the alternative is "Q", which refers to something close to quoted-printable) "?" functions as a separator "uLG..." is the actual value, encoded using the encoding specified before "?=" ends the encoded value
그래서 "?" 실제로 이것을 얻습니다 (JSON 표기법)
["=", "gb2312", "B", "uLGxvmhlbrixsb5nLnhscw==", "="]
결과 배열에서 "B"가 위치 2에있는 경우 위치 3에서 Base-64 인코딩 된 문자열에 직면 해 있습니다. 일단 해독 한 후에는 위치 1의 인코딩에주의를 기울여야합니다. 아마도 변환하는 것이 가장 좋습니다. 그 정보를 사용하여 UTF-8의 모든 것.
@gnud, @edg- 내가 오해하지 않는 한, 그는 파일 내용 @setori가 아닌 파일 이름에 대해 묻고 있습니다 - Content -Trasfer -Encoding은 "파일 이름"이 아니라 파일의 내용이 어떻게 인코딩되는지 알려줍니다.
나는 전문가가 아니지만 파일 이름 의이 부분은 다음과 같은 캐릭터에 대해 말하고 있습니다.
=? gb2312? b?
RFCS의 문서를 찾고 있습니다 ... 아! 여기있어: http://tools.ietf.org/html/rfc2047
RFC의 말 :
일반적으로 "인코딩 된 단어"는 "=?"로 시작하는 인쇄 가능한 ASCII 문자 시퀀스이며 "? ="로 끝나고 사이에 두 개 "?"가 있습니다.
다른 것을 볼 수있는 것은 Sharpmimetools의 코드, 내에서 사용하는 Mime Parser (C#)의 코드입니다. 버그 추적 앱, BugTracker.net
Bobince의 방법보다 더 나은 방법이 있습니다. decode_header
. 여기서 찾았습니다. http://mail.python.org/pipermail/email-sig/2007-march/000332.html
name = unicode(email.header.make_header(email.header.decode_header(x)))
글쎄, 당신은 이메일 헤더를 사전으로 구문 분석합니다. 그런 다음 Content-Transfer-Encoding이 설정되어 있는지 확인하고 = "Base64"또는 "Base-64"인지 확인하십시오.
질문 : "" "또한 실제로 어떤 유형의 파일이 IE .xls 또는 .doc인지 알아야하므로 첨부 파일을 올바르게 처리하려면 파일 이름을 해독해야하지만 위와 같이 GB2312는 Jython에서 지원되지 않는 것 같습니다. , 어떤 원형 교차로를 알고 있습니까? "" "
데이터:
Content-Type: application/vnd.ms-excel;
name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
관찰 :
(1) 첫 번째 줄은 Microsoft Excel을 나타냅니다. .xls
보다 좋아 보입니다 .doc
(2)
>>> import base64
>>> base64.b64decode("uLGxvmhlbrixsb5nLnhscw==")
'\xb8\xb1\xb1\xbehen\xb8\xb1\xb1\xbeg.xls'
>>>
(a) 확장이있는 것으로 보인다 .xls
- 필요 없음 gb2312
코덱
(b) 파일 시스템 안전 파일 이름을 원한다면 Base64의 "-_"변형을 사용할 수 있습니다.
(c) 가치가있는 것에 대해 파일 이름은 XYhenXYg.xls
여기서 x와 y는 함께 "복사"를 의미하고 나머지는 문자 그대로 ASCII 문자입니다.