
У меня есть файлы текста в кодировке ISO-8859, которые мне регулярно присылают клиенты, содержащие отладочную информацию.
Недавно они начали появляться в моем почтовом ящике в кодировке ASCII с несколькими дополнительными символами в файле, что привело к поломке парсера, который я написал для этих файлов.
Я сузил круг до клиента электронной почты, используемого клиентом, который меняет кодировку.
Можно ли отменить это ложное изменение кодировки?
Поскольку я работаю с Linux, я бы предпочел решение для Linux, но мне были бы интересны и решения для других ОС.
Вот некоторые результаты для справки и информации:
$ 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
Примеры контента (Информация отличается, структурадолженбыть тем же самым, но wrong_enc.txt имеет дополнительные символы после '=' и в конце слова (например):
$ 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
=
за которым следует новая строка, удаляется (строки объединяются);=
за которым следуют две шестнадцатеричные цифры, заменяется соответствующим байтом.