
디버그 정보가 포함된 고객이 정기적으로 나에게 보낸 ISO-8859 인코딩 텍스트 파일이 있습니다.
최근에는 파일에 몇 가지 추가 문자가 포함된 ASCII로 인코딩된 파일이 내 받은 편지함에 표시되기 시작하여 이 파일에 대해 작성한 파서를 손상시켰습니다.
인코딩을 변경하는 고객이 사용하는 이메일 클라이언트로 범위를 좁혔습니다.
이 잘못된 인코딩 변경을 되돌릴 수 있습니까?
저는 Linux를 사용하고 있기 때문에 Linux용 솔루션을 선호하지만 다른 OS용 솔루션에도 관심이 있습니다.
참조 및 정보를 위한 몇 가지 출력은 다음과 같습니다.
$ file /tmp/{wrong,right}_enc.txt
/tmp/wrong_enc.txt: ASCII text
/tmp/right_enc.txt: ISO-8859 text, with very long lines, with CRLF line terminators
$ file -bi /tmp/{wrong,right}_enc.txt
text/plain; charset=us-ascii
text/plain; charset=iso-8859-1
콘텐츠 예시(정보가 다름, 구조가 다름)~해야 한다동일하지만 잘못된_enc.txt에는 '=' 뒤에 그리고 EOL에 추가 문자가 있습니다. 예를 들어):
$ head /tmp/{wrong,right}_enc.txt
==> /tmp/wrong_enc.txt <==
Tue Jun 11 15:51:54 2019=0D
=0D
=0D
###Eth-eth0-driver =3D igb=0D
###Eth-eth0-ipaddr =3D 192.168.99.100=0D
###Eth-eth0-link =3D yes=0D
###Eth-eth1-driver =3D e1000e=0D
###Eth-eth1-ipaddr =3D =0D
###Eth-eth1-link =3D no=0D
==> /tmp/right_enc.txt <==
Wed Apr 17 16:47:21 2019
###Eth-eth0-driver = e1000e
###Eth-eth0-ipaddr = 192.168.178.35
###Eth-eth0-link = yes
###Eth-ethnames = eth0
###Eth-ethtool-eth0 =
답변1
표시된 인코딩은인용-인쇄 가능, "원시" 이메일 소스 텍스트를 보고 있는지 확인하는 것은 완전히 정상적인 현상입니다. 대부분의 비ASCII 메시지와 텍스트 첨부 파일, 심지어 일부 순수 ASCII 메시지도 QP(또는 Base64)를 사용하여 인코딩됩니다.
보내는 메일 클라이언트가 해당 용도를 올바르게 표시한 경우콘텐츠 전송 인코딩헤더가 있으면 수신 메일 클라이언트는 자동으로 QP를 일반 텍스트로 디코딩합니다. (MIME 헤더는 정확하지만 메일 클라이언트가 이 디코딩을 수행하지 않는 경우 손상된 것은 고객의 메일 클라이언트가 아니라 메일 클라이언트입니다.)
디코딩을 직접 수행해야 하는 경우 다양한 라이브러리가 있습니다.
ruby -e 'print STDIN.read.unpack("M")[0]' < wrong.txt > fixed.txt
perl -0777 -ne 'use MIME::QuotedPrint; print decode_qp($_)' < wrong.txt > fixed.txt
당신이 동안~해야 한다기존 모듈을 사용하면 QP를 직접 디코딩하는 것이 상대적으로 간단합니다.
perl -0777 -pe 's/=\n//gs; s/=([0-9A-F]{2})/pack("C", hex($1))/gse' < wrong.txt > fixed.txt
=
이어서 개행 문자가 제거됩니다(행이 함께 연결됨).=
그 뒤에 두 개의 16진수 숫자가 해당 바이트로 대체됩니다.