Как конвертировать специальные символы UTF-8 в Bash?

Я пишу на скрипте, который извлекает и сохраняет jpeg-прикрепления из писем и передает их imagemagick. Тем не менее, я живу в Германии, и специальные символы в тексте/теме электронной почты как "ö", "ä", "ü" и "ß" довольно распространены.

я извлекаю тему с помощью formail:

    SUBJECT=$(formail -zxSubject: <"$file")

в результате:

  • =?UTF-8?Кью?Meine_G=c3=bcte?=

("Meine Güte") или даже хуже

  • =?UTF-8?Би?U2Now7ZuZSBHcsO8w59lIQ==?=

("Schöne Grüße!").

Я пытаюсь использовать часть темы в качестве имени файла и в качестве текстовой аннотации imagemagick, которая, очевидно, не работает.

Как преобразовать этот текст UTF-8 в текст со специальными символами в bash?

спасибо заранее!
Markus

5
задан Markus
источник

2 ответов

как преобразовать этот текст UTF-8 в текст со специальными символами в bash?

то, что у вас есть не совсем "UTF-8 text". Ты на самом деле хочу простой текст UTF-8 как выход, а это то, что Linux использует для "особой буквы" везде.

ваш вход, вместо этого, MIME (RFC 2047) кодировка UTF-8. "Ъ" отмечает в кавычки-печатаемый режим, и "Ъ" знаков находитесь в base64. Среди других, Perl кодировать::МИМ::заголовок можно расшифровать как:

#!/usr/bin/env perl
use open qw(:std :utf8);
use Encode qw(decode);

while (my $line = <STDIN>) {
        print decode("MIME-Header", $line);
}

Oneliner (см. perldoc perlrun для объяснения):

perl -CS -MEncode -ne 'print decode("MIME-Header", $_)'

Это может взять любого формата на входе:

$ echo "Subject: =?UTF-8?Q?Meine_G=c3=bcte?=, \
                 =?UTF-8?B?U2Now7ZuZSBHcsO8w59lIQ==?=" | perl ./decode.pl
Subject: Meine Güte, Schöne Grüße!
6
отвечен grawity 2017-03-24 18:44:10
источник

тема сообщения-заголовок и заголовки должны содержать только символы ASCII. Вот почему UTF-8 (или любая другая кодировка не ASCII) тема должна быть закодирована.

этот способ кодирования не-ASCII символов в ASCII описан в RFC 1342.

В основном, закодированная тема имеет (как вы уже указали в ваших примерах) следующий формат:

=?charset?encoding?encoded-text?=

на основе кодирования значение кодируется - текст декодируется либо в кавычках-для печати (Q) или как base64 (Си.)

чтобы получить читаемую форму, вам нужно передать кодированную текстовую часть значения заголовка темы программе, которая ее декодирует. Я считаю, что есть некоторые автономные команды для этого (uudecode), но я предпочитаю использовать Perl One-liners:

для печати кавычках:

perl -pe 'use MIME::QuotedPrint; $_=MIME::QuotedPrint::decode($_);'

и для base64:

perl -pe 'use MIME::Base64; $_=MIME::Base64::decode($_);'

убедитесь, что вы передаете только часть закодированного текста, а не все значение заголовка темы.

6
отвечен blami 2015-09-13 00:10:27
источник

Другие вопросы bash email utf-8