From 139e94af0f4bf557bec54e1e11a981a1957801e6 Mon Sep 17 00:00:00 2001 From: neconohitomi Date: Sun, 6 Sep 2026 01:23:36 +0900 Subject: [PATCH] Fix case-insensitive charset detection Assisted-by: ChatGPT:gpt-5.6 Signed-off-by: neconohitomi --- lib/IMAP/Charset/Converter.php | 4 ++-- tests/Unit/IMAP/Charset/ConverterTest.php | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/IMAP/Charset/Converter.php b/lib/IMAP/Charset/Converter.php index 8a804ef81f..a640b8fff8 100644 --- a/lib/IMAP/Charset/Converter.php +++ b/lib/IMAP/Charset/Converter.php @@ -35,7 +35,7 @@ private function normalizeCharset(string $charset): string { $charset = trim($charset); $lowerCharset = strtolower($charset); - return self::CHARSET_MAP[$lowerCharset] ?? $charset; + return self::CHARSET_MAP[$lowerCharset] ?? strtoupper($charset); } /** @@ -45,7 +45,7 @@ private function mbEncodings(): array { /** @var list|null $encodings */ static $encodings = null; if ($encodings === null) { - $encodings = mb_list_encodings(); + $encodings = array_map('strtoupper', mb_list_encodings()); } return $encodings; diff --git a/tests/Unit/IMAP/Charset/ConverterTest.php b/tests/Unit/IMAP/Charset/ConverterTest.php index 107ebb499b..b5b17a7023 100644 --- a/tests/Unit/IMAP/Charset/ConverterTest.php +++ b/tests/Unit/IMAP/Charset/ConverterTest.php @@ -56,10 +56,18 @@ public function dataProviderMimeParts(): array { $iso88591MimePart_noCharset = new Horde_Mime_Part(); $iso88591MimePart_noCharset->setContents('בה בדף לחבר ממונרכיה, בקר בגרסה ואמנות דת'); // Japanese + $iso2022jpText = '外せ園査リツハワ題'; + $iso2022jpBytes = mb_convert_encoding($iso2022jpText, 'ISO-2022-JP', 'UTF-8'); + $iso2022jpMimePart = new Horde_Mime_Part(); $iso2022jpMimePart->setType('text/plain'); $iso2022jpMimePart->setCharset('ISO-2022-JP'); - $iso2022jpMimePart->setContents(mb_convert_encoding('外せ園査リツハワ題', 'ISO-2022-JP', 'UTF-8')); + $iso2022jpMimePart->setContents($iso2022jpBytes); + + $iso2022jpLowerMimePart = new Horde_Mime_Part(); + $iso2022jpLowerMimePart->setType('text/plain'); + $iso2022jpLowerMimePart->setCharset('iso-2022-jp'); + $iso2022jpLowerMimePart->setContents($iso2022jpBytes); // Korean (Outlook) - all ks_c_5601 spellings map to UHC (CP949). Encode // with iconv to avoid depending on mbstring's UHC support, and cover the // case-insensitive charset spellings. @@ -84,7 +92,8 @@ public function dataProviderMimeParts(): array { [$utfMimePart, '😊'], [$utfMimeStreamPart, '💦'], [$iso88591MimePart, 'Ümlaut'], - [$iso2022jpMimePart, '外せ園査リツハワ題'], + [$iso2022jpMimePart, $iso2022jpText], + [$iso2022jpLowerMimePart, $iso2022jpText], [$iso88591MimePart_noCharset, 'בה בדף לחבר ממונרכיה, בקר בגרסה ואמנות דת'], ], $koreanCases, [ [$windowsMimePart, 'قام زهاء أوراقهم ما,'],