[완료] Gmail등이 charset이 명시되지 않은 메일 해더도 문제없이 처리할 수 있는 이유
글쓴이: klara / 작성시간: 목, 2010/08/12 - 10:42오후
표준에서는 ascii외의 문자는 반드시 Q또는 B인코딩을 이용해서 해더에는 ascii문자만 포함하도록 되어있습니다.
하지만, 실제로는 이를 지키지 않는 메일이 많고, 비단 스팸메일뿐만 아니라 한국의 각종 웹사이트에서 보내는 메일링조차도 Q/B인코딩하지 않고 그냥 중국어나 한국어가 그대로 해더파일에 적혀있는 엉터리해더가 많습니다.
그럼에도 불구하고, Gmail은 글자가 깨져 표시되는 일 없이 (제경험은 100%지만) 거의 정확하게 제목이나 본문을 표시해줍니다.
이건 일반적인 charset auto-detection으로 가능한 것인가요?
아니면 뭔가 메일에만 해당하는 특수한 방법을 동원한 것일까요?
혹시 관련된 내용으로 공개되었거나 알려진 내용이 있다면 가르쳐주시면 감사하겠습니다.
Forums:
주의 : 지금은 안
주의 : 지금은 안 맞을 수 있습니다.
예전에 나온 이야기로는 인코딩이 정해져 있지 않으면 현지 인코딩으로 간주하고 메일 내용을 뿌려주는 방식을 사용하였습니다.
국내 메일의 경우에는 인코딩 정보가 없으면 EUC-KR로 뿌리고, 인코딩이 명시되어 있으면 HTML charset에 따라 변환해서 보여주는 방식이었습니다.
이 내용이 알려진 다음에 업데이트 내역들이 상당히 많아서 변경이 되었을 수 있습니다.
그말씀은, '메일
그말씀은, '메일 발송처의 ip같은 걸로 지역을 판정하고, 그 지역에서 표준이라고 생각되는 인코딩을 적용한다'라는 뜻인가요?
메일 읽고 있는
메일 읽고 있는 사람이 설정한 인코딩입니다.
특정인코딩에
특정인코딩에 관계없이 안깨지고 표시됩니다.
실제로 각각 EUC-KR, JIS7, BIG5으로 인코딩된, 인코딩이 명시되지 않은 해더가 문제없이 표시되는 것을 확인하였습니다.
말씀대로 이미 다른 기능을 이용하고 있을듯하네요.
http://chardet.feedparser.org
http://chardet.feedparser.org/
http://www.mozilla.org/projects/intl/chardet.html
그냥 뭐 이런 게 있습니다.
---- 절취선 ----
http://blog.peremen.name
chardet같은 charset
chardet같은 charset auto-detection을 해주는 라이브러리가 있다는 것은 알고 있습니다.
다만, 예를 들어, 적어주신 mozilla의 chardet같은 경우 제가 이전에 실제로 써봤더니 수십건에 한건정도 틀린게 나오기도 하는 등 그렇게 정확도가 높지 않았습니다.
하지만, 마찬가지로 개인적인 경험이지만, gmail에서는 지금까지 봐온 수백건의 엉터리해더의 메일중에, 글자가 깨진 경우는 한번도 못봤습니다.
혹시 단순한 auto-detection외에 다른 무언가가 또 있는 걸까해서 올린 질문이었습니다.
자동 감지를 쓰긴
자동 감지를 쓰긴 쓰지만, 샘플 셋이 좀 더 많지 않을까 생각합니다. 모질라의 소스 코드를 보니 데이터 셋 자체가 오래 전에 업데이트가 끊겼지만, 구글이라면 얼마든지 더 나은 샘플 셋을 모을 수 있을 겁니다.
---- 절취선 ----
http://blog.peremen.name
아... 독자적인 자동
아... 독자적인 자동 감지기능을 이용하고 있을 수 있겠군요...
어딘가 공개해주면 좋을텐데...
아마 메일 헤더에
아마 메일 헤더에 charset 이 없는 경우, 본문 파트에 charset 이 명기되어 있으면 그것을 이용하고
없다면, 본문의 내용에서 charset auto-detection 을 해서 헤더에 이용할 것 같습니다.
역시 charset
역시 charset autodetection인듯하네요.
답변 달아주신 분들 모두 감사드립니다.
제가 만든 웹메일
제가 만든 웹메일 코드에서는
1. 메일의 원문에서 charset 을 지정한 부분이 있는지 전체 검색을 해봅니다. 있으면 그것이 기준 charset 으로 간주합니다.
2. 1에서도 알아내지 못하면 본문에 대해 mb_detect_encoding 함수를 이용합니다.
3. ksc5601, ks_c_5601_1987 은 워낙 지 꼴리는대로 타이핑한 경우가 많은지라 5601 문구를 기준으로 euc-kr로 간주합니다.
4. 문자열에 &#[0-9]+ 이 포함되어 있을 경우 일일이 UCS-2 코드로 인식하고 문자로 변환시킵니다.
첨부 이미지는 그동안 디코딩 실패했었던 메일 제목을 위의 방법으로 디코딩한 화면입니다.
댓글 달기