[완료] Gmail등이 charset이 명시되지 않은 메일 해더도 문제없이 처리할 수 있는 이유

klyx의 이미지

표준에서는 ascii외의 문자는 반드시 Q또는 B인코딩을 이용해서 해더에는 ascii문자만 포함하도록 되어있습니다.
하지만, 실제로는 이를 지키지 않는 메일이 많고, 비단 스팸메일뿐만 아니라 한국의 각종 웹사이트에서 보내는 메일링조차도 Q/B인코딩하지 않고 그냥 중국어나 한국어가 그대로 해더파일에 적혀있는 엉터리해더가 많습니다.

그럼에도 불구하고, Gmail은 글자가 깨져 표시되는 일 없이 (제경험은 100%지만) 거의 정확하게 제목이나 본문을 표시해줍니다.
이건 일반적인 charset auto-detection으로 가능한 것인가요?
아니면 뭔가 메일에만 해당하는 특수한 방법을 동원한 것일까요?
혹시 관련된 내용으로 공개되었거나 알려진 내용이 있다면 가르쳐주시면 감사하겠습니다.

세이군의 이미지

주의 : 지금은 안 맞을 수 있습니다.
예전에 나온 이야기로는 인코딩이 정해져 있지 않으면 현지 인코딩으로 간주하고 메일 내용을 뿌려주는 방식을 사용하였습니다.

국내 메일의 경우에는 인코딩 정보가 없으면 EUC-KR로 뿌리고, 인코딩이 명시되어 있으면 HTML charset에 따라 변환해서 보여주는 방식이었습니다.
이 내용이 알려진 다음에 업데이트 내역들이 상당히 많아서 변경이 되었을 수 있습니다.

klyx의 이미지

그말씀은, '메일 발송처의 ip같은 걸로 지역을 판정하고, 그 지역에서 표준이라고 생각되는 인코딩을 적용한다'라는 뜻인가요?

세이군의 이미지

메일 읽고 있는 사람이 설정한 인코딩입니다.

klyx의 이미지

특정인코딩에 관계없이 안깨지고 표시됩니다.
실제로 각각 EUC-KR, JIS7, BIG5으로 인코딩된, 인코딩이 명시되지 않은 해더가 문제없이 표시되는 것을 확인하였습니다.
말씀대로 이미 다른 기능을 이용하고 있을듯하네요.

danskesb의 이미지

klyx의 이미지

chardet같은 charset auto-detection을 해주는 라이브러리가 있다는 것은 알고 있습니다.
다만, 예를 들어, 적어주신 mozilla의 chardet같은 경우 제가 이전에 실제로 써봤더니 수십건에 한건정도 틀린게 나오기도 하는 등 그렇게 정확도가 높지 않았습니다.
하지만, 마찬가지로 개인적인 경험이지만, gmail에서는 지금까지 봐온 수백건의 엉터리해더의 메일중에, 글자가 깨진 경우는 한번도 못봤습니다.
혹시 단순한 auto-detection외에 다른 무언가가 또 있는 걸까해서 올린 질문이었습니다.

danskesb의 이미지

자동 감지를 쓰긴 쓰지만, 샘플 셋이 좀 더 많지 않을까 생각합니다. 모질라의 소스 코드를 보니 데이터 셋 자체가 오래 전에 업데이트가 끊겼지만, 구글이라면 얼마든지 더 나은 샘플 셋을 모을 수 있을 겁니다.

---- 절취선 ----
http://blog.peremen.name

klyx의 이미지

아... 독자적인 자동 감지기능을 이용하고 있을 수 있겠군요...
어딘가 공개해주면 좋을텐데...

unsouled의 이미지

아마 메일 헤더에 charset 이 없는 경우, 본문 파트에 charset 이 명기되어 있으면 그것을 이용하고

없다면, 본문의 내용에서 charset auto-detection 을 해서 헤더에 이용할 것 같습니다.

klyx의 이미지

역시 charset autodetection인듯하네요.
답변 달아주신 분들 모두 감사드립니다.

ironiris의 이미지

제가 만든 웹메일 코드에서는
1. 메일의 원문에서 charset 을 지정한 부분이 있는지 전체 검색을 해봅니다. 있으면 그것이 기준 charset 으로 간주합니다.
2. 1에서도 알아내지 못하면 본문에 대해 mb_detect_encoding 함수를 이용합니다.
3. ksc5601, ks_c_5601_1987 은 워낙 지 꼴리는대로 타이핑한 경우가 많은지라 5601 문구를 기준으로 euc-kr로 간주합니다.
4. 문자열에 &#[0-9]+ 이 포함되어 있을 경우 일일이 UCS-2 코드로 인식하고 문자로 변환시킵니다.

첨부 이미지는 그동안 디코딩 실패했었던 메일 제목을 위의 방법으로 디코딩한 화면입니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon decode.png12.19 KB

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.