Исправить/вернуть неправильную кодировку файла

Исправить/вернуть неправильную кодировку файла

У меня есть файлы текста в кодировке 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
  1. =за которым следует новая строка, удаляется (строки объединяются);
  2. =за которым следуют две шестнадцатеричные цифры, заменяется соответствующим байтом.

Связанный контент