Remove mb encode mimeheader special code and replace it with default function call

This commit is contained in:
Clemens Schwaighofer
2024-04-17 10:13:32 +09:00
parent e8f4c82f59
commit d54a6cbdf5
3 changed files with 46 additions and 56 deletions

View File

@@ -15,6 +15,7 @@ class MimeEncode
/**
* wrapper function for mb mime convert
* for correct conversion with long strings
* NOTE: This is only a wrapper for mb_encode_mimeheader to stay compatible
*
* @param string $string string to encode
* @param string $encoding target encoding
@@ -29,38 +30,9 @@ class MimeEncode
$current_internal_encoding = mb_internal_encoding();
// set internal encoding, so the mimeheader encode works correctly
mb_internal_encoding($encoding);
// if a subject, make a work around for the broken mb_mimencode
$pos = 0;
// after 36 single bytes characters,
// if then comes MB, it is broken
// has to 2 x 36 < 74 so the mb_encode_mimeheader
// 74 hardcoded split does not get triggered
$split = 36;
$_string = '';
while ($pos < mb_strlen($string, $encoding)) {
$output = mb_strimwidth($string, $pos, $split, "", $encoding);
$pos += mb_strlen($output, $encoding);
// if the strinlen is 0 here, get out of the loop
if (!mb_strlen($output, $encoding)) {
$pos += mb_strlen($string, $encoding);
}
$_string_encoded = mb_encode_mimeheader($output, $encoding);
// only make linebreaks if we have mime encoded code inside
// the space only belongs in the second line
if ($_string && preg_match("/^=\?/", $_string_encoded)) {
$_string .= $line_break . " ";
} elseif (
// hack for plain text with space at the end
mb_strlen($output, $encoding) == $split &&
mb_substr($output, -1, 1, $encoding) == " "
) {
// if output ends with space, add one more
$_string_encoded .= " ";
}
$_string .= $_string_encoded;
}
// strip out any spaces BEFORE a line break
$string = str_replace(" " . $line_break, $line_break, $_string);
// use the internal convert to mime header
// it works from PHP 8.2 on
$string = mb_encode_mimeheader($string, $encoding, 'B', $line_break);
// before we end, reset internal encoding
mb_internal_encoding($current_internal_encoding);
// return mime encoded string