Как правильно раскодировать сложную строку base64, где три =?UTF-8?B?
текст, выделенный жирным шрифтомЕсть вот такая строка - это название файла во вложении к email:
=?UTF-8?B?0KHQutC70LDQtCDQntCe0J4g0JPQsNGA0LDQvdGCINC00LvRjyDQkdGL0YHRgtGA0L7QutCw0LHQtdC7?= =?UTF-8?B?0YwsIFJ1c0NhYmxlLCDQmtCw0LHQtdC70YzQvdGL0Lkg0YHQv9GA0LDQstC+0YfQvdC40LosINCT0LQ=?= =?UTF-8?B?0LXQmtCw0LHQtdC70YwsINCa0LDQsdC10LvRjCDQntC90LvQsNC50L0uINGCLiA4LTkwOS0zNDMtMTMt?= 00..xls
Тут, как видим, три =?UTF-8?B? - и это всё одна строка, заканчивающаяся на xls. Исходное название файла, до кодировки почтовой программой - "Склад ООО Гарант для Быстрокабель, RusCable, Кабельный справочник, ГдеКабель, Кабель Онлайн. т. 8-909-343-13-00..xls"
Как из закодированной строки =?UTF-8?B?.... получить исходную строку на русском?
Пробовал вот так:
$atachname = base64_decode(str_ireplace(array("=?utf-8?B?",'?='), array('',''), $atachname));
В таком варианте нормально раскодирует до буквы Г в "Где кабель", а после неё идёт уже кривая кодировка.
UPD. Благодаря совету Akin вопрос решён. Написал вот такую функцию для декодирования таких строк:
function decode_utf8($str)
{
$parts = preg_split("/=\?UTF-8\?B\?/i", $str);
$res_str = '';
foreach($parts as $p)
{
if ($p)
{
$parts2 = preg_split("/\?=/i", $p);
$s = base64_decode($parts2[0]);
if (count($parts2) > 1 )
$s .= $parts2[1];
$res_str .= $s.' ';
}
}
return trim($res_str);
}
Ответы (2 шт):
Написал функцию, которая решает эту задачу:
function decode_utf8($str)
{
$parts = preg_split("/=\?UTF-8\?B\?/i", $str);
$res_str = '';
foreach($parts as $p)
{
if ($p)
{
$parts2 = preg_split("/\?=/i", $p);
$s = base64_decode($parts2[0]);
if (count($parts2) > 1 )
$s .= $parts2[1];
$res_str .= $s.' ';
}
}
return trim($res_str);
}
function decode_utf8(string $str): string
{
$temp = preg_split('/\s*\?=\s*/', preg_replace('/\s*=\?UTF-8\?B\?\s*/', '', $str));
$end = array_pop($temp);
$out = '';
foreach ($temp as $value) {
$out .= base64_decode($value);
}
return $out . $end;
}