파일 업로드
  1. base64hub
  2. 웹·토큰 도구
  3. Quoted-printable

Quoted-Printable 인코더와 디코더

Gr=C3=BC=C3=9Fe 같은 이메일의 quoted-printable 텍스트를 Grüße로 디코딩하거나, 메일 프로그램과 같은 방식으로 인코딩합니다. 필요한 바이트는 =XX로 쓰고 76자에서 소프트 줄 바꿈을 넣습니다.

무료 가입 없음, 제한 없음 로컬 업로드 없음 Python binascii.b2a_qp와 바이트 단위로 일치 업데이트 2026. 10. 27.
입력 0바이트 0 B출력 0

브라우저에서 처리됩니다. 이 페이지는 데이터를 어디로도 보낼 수 없습니다 – 확인 방법

quoted-printable을 디코딩하는 방법

  1. 도구 위의 Quoted-printable → 텍스트를 눌러 디코딩으로 전환하세요.
  2. 인코딩된 텍스트를 입력란에 붙여넣으세요. 예를 들어 메일 원본에서 복사한 본문 파트입니다.
  3. 출력에서 텍스트를 확인하세요. 악센트 문자나 한글이 깨진다면 출력 아래 문자 인코딩을 파트의 Content-Type 헤더에 적힌 값(예: charset=iso-8859-1, 오래된 한국어 메일은 EUC-KR)으로 바꾸세요.
  4. 출력 복사 또는 다운로드를 누르세요. 소프트 줄 바꿈은 합쳐지고 모든 =XX는 원래 바이트로 돌아갑니다.

인코딩하려면 방향을 텍스트 → Quoted-printable로 두고 텍스트를 입력하거나 붙여넣으세요. 입력 아래 문자 인코딩이 ASCII가 아닌 문자를 어떤 바이트로 바꿀지 정합니다.

quoted-printable의 동작 방식

quoted-printable(RFC 2045, 6.7절)은 가능한 한 텍스트를 읽을 수 있게 두고 꼭 필요한 것만 이스케이프합니다.

  • 출력 가능한 ASCII 문자는 =를 빼고 그대로 둡니다.
  • 나머지 바이트는 모두 =와 대문자 hex 두 자리로 씁니다. UTF-8에서는 ASCII가 아닌 문자 하나가 이스케이프 2~4개가 됩니다.
  • = 자체는 =3D가 됩니다.
  • 줄 끝의 공백이나 탭은 =20 또는 =09가 됩니다.
  • 한 줄은 최대 76자입니다. 더 긴 줄은 소프트 줄 바꿈, 즉 줄 끝의 =로 나뉘며 디코더가 이를 제거합니다.
텍스트Quoted-printable
cafécaf=C3=A9
Grüße aus MünchenGr=C3=BC=C3=9Fe aus M=C3=BCnchen
100% = €5100% =3D =E2=82=AC5
<p style="color:red">Hi</p><p style=3D"color:red">Hi</p>
Caf=E9를 ISO-8859-1로 디코딩Café

마지막 행의 =E9는 단일 바이트로, ISO-8859-1과 Windows-1252에서는 é이지만 UTF-8에서는 단독으로 올바르지 않습니다. 따라서 결과는 어떤 문자 인코딩으로 디코딩하느냐에 따라 달라집니다.

텍스트 모드와 바이너리 모드

기본적으로 인코더는 입력을 텍스트로 다룹니다. 줄 바꿈은 실제 줄 바꿈으로 남고, Python의 binascii.b2a_qp와 마찬가지로 첫 줄이 CRLF로 끝나면 이후의 단독 LF도 CRLF가 됩니다. 이메일 텍스트에는 맞는 동작이지만 바이트는 달라집니다.

정확한 바이트가 중요하면 줄 바꿈 인코딩 (바이너리) 를 켜세요. 그러면 줄 바꿈이 =0D와 =0A로 기록되어 Hello, CRLF, World는 Hello=0D=0AWorld가 되고, 디코딩하면 입력한 그대로 돌아옵니다. 이미지 같은 실제 바이너리 데이터라면 어차피 Base64가 더 낫습니다.

이메일에서 quoted-printable과 Base64

메일 프로그램은 MIME 파트마다 Content-Transfer-Encoding을 고릅니다. quoted-printable은 대부분 ASCII인 텍스트에 알맞습니다. 읽을 수 있는 상태로 남고 크기도 조금만 늘기 때문입니다. Base64는 약 33%의 고정 오버헤드가 있으며, 이스케이프가 필요한 바이트가 많아지면 더 유리합니다.

텍스트UTF-8 바이트Quoted-printableBase64
Grüße aus München2032자28자
Привет, мир (러시아어)2056자28자

17자 중 ASCII가 아닌 글자가 셋뿐인 독일어 텍스트도 이미 quoted-printable이 Base64보다 큽니다. 키릴 문자는 Base64의 두 배입니다. 이메일에 필요한 76자 줄의 Base64를 만들려면 MIME Base64 인코더를 쓰세요. 이메일 속 Base64에서는 첨부 파일과 인코딩된 헤더를 포함해 두 인코딩이 메시지에 어떻게 나타나는지 설명합니다.

메일 전체 읽기

원본 메시지에서 본문 파트 하나를 복사하는 방법은 빠르게 확인할 때 쓸 만합니다. .eml 파일 전체라면 EML 디코더가 헤더를 파싱하고, quoted-printable과 Base64 파트를 선언된 문자 인코딩으로 디코딩하며, 첨부 파일을 다운로드할 수 있게 나열합니다. quoted-printable은 이메일 밖에서도 쓰입니다. 예를 들어 vCard 2.1 파일의 ENCODING=QUOTED-PRINTABLE이 그렇습니다. 콜론 뒤의 값을 여기에 붙여넣으세요.

코드에서 quoted-printable

import quopri
quopri.encodestring("café".encode("utf-8"))            # b'caf=C3=A9'
quopri.decodestring(b"caf=C3=A9 =3D 5=E2=82=AC").decode("utf-8")   # 'café = 5€'

Python의 email 패키지는 알맞은 디코딩을 자동으로 적용합니다. msg.get_payload(decode=True)는 전송 인코딩이 무엇이든 파트의 디코딩된 바이트를 반환합니다. Base64 쪽은 Python 페이지에서 다룹니다.

자주 묻는 질문

이메일에 있는 =3D는 무슨 뜻인가요?

인코딩된 등호입니다. quoted-printable에서는 =가 이스케이프의 시작이므로 실제 =는 바이트 값의 hex인 =3D로 써야 합니다. HTML 메일에서 style=3D"color:red"처럼 자주 보입니다.

메일 원본에서 줄 끝이 =로 끝나는 이유는 무엇인가요?

소프트 줄 바꿈입니다. quoted-printable의 한 줄은 최대 76자이므로 긴 줄은 나뉘고, 나뉜 곳마다 줄 끝에 =를 붙입니다. 디코더는 조각을 다시 한 줄로 합칩니다.

줄 끝의 =20은 무슨 뜻인가요?

인코딩된 공백입니다. 메일 시스템이 줄 끝 공백을 지울 수 있어서, quoted-printable은 줄 끝의 공백이나 탭을 =20 또는 =09로 써서 보호합니다.

Python에서 quoted-printable을 디코딩하려면 어떻게 하나요?

quopri.decodestring(data) 또는 binascii.a2b_qp(data)가 바이트를 반환합니다. 그다음 .decode("utf-8")이나 Content-Type 헤더에 적힌 문자 인코딩으로 디코딩하세요.

=?UTF-8?Q?...?= 형태의 메일 제목도 디코딩할 수 있나요?

이 페이지에서는 안 됩니다. 이것은 RFC 2047 인코딩 단어로, 공백을 _로 쓰는 비슷한 Q 인코딩을 사용합니다. EML 디코더는 헤더의 인코딩 단어와 quoted-printable 본문을 함께 디코딩합니다.