|
|
@ -176,6 +176,7 @@ class rcube_charset
|
|
|
|
{
|
|
|
|
{
|
|
|
|
static $iconv_options = null;
|
|
|
|
static $iconv_options = null;
|
|
|
|
static $mbstring_list = null;
|
|
|
|
static $mbstring_list = null;
|
|
|
|
|
|
|
|
static $mbstring_sch = null;
|
|
|
|
static $conv = null;
|
|
|
|
static $conv = null;
|
|
|
|
|
|
|
|
|
|
|
|
$to = empty($to) ? strtoupper(RCMAIL_CHARSET) : $to;
|
|
|
|
$to = empty($to) ? strtoupper(RCMAIL_CHARSET) : $to;
|
|
|
@ -221,6 +222,7 @@ class rcube_charset
|
|
|
|
|
|
|
|
|
|
|
|
if ($mbstring_list === null) {
|
|
|
|
if ($mbstring_list === null) {
|
|
|
|
if (extension_loaded('mbstring')) {
|
|
|
|
if (extension_loaded('mbstring')) {
|
|
|
|
|
|
|
|
$mbstring_sch = mb_substitute_character();
|
|
|
|
$mbstring_list = mb_list_encodings();
|
|
|
|
$mbstring_list = mb_list_encodings();
|
|
|
|
$mbstring_list = array_map('strtoupper', $mbstring_list);
|
|
|
|
$mbstring_list = array_map('strtoupper', $mbstring_list);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -229,14 +231,25 @@ class rcube_charset
|
|
|
|
// convert charset using mbstring module
|
|
|
|
// convert charset using mbstring module
|
|
|
|
if ($mbstring_list !== null) {
|
|
|
|
if ($mbstring_list !== null) {
|
|
|
|
$aliases['WINDOWS-1257'] = 'ISO-8859-13';
|
|
|
|
$aliases['WINDOWS-1257'] = 'ISO-8859-13';
|
|
|
|
|
|
|
|
// it happens that mbstring supports ASCII but not US-ASCII
|
|
|
|
|
|
|
|
if (($from == 'US-ASCII' || $to == 'US-ASCII') && !in_array('US-ASCII', $mbstring_list)) {
|
|
|
|
|
|
|
|
$aliases['US-ASCII'] = 'ASCII';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$mb_from = $aliases[$from] ? $aliases[$from] : $from;
|
|
|
|
$mb_from = $aliases[$from] ? $aliases[$from] : $from;
|
|
|
|
$mb_to = $aliases[$to] ? $aliases[$to] : $to;
|
|
|
|
$mb_to = $aliases[$to] ? $aliases[$to] : $to;
|
|
|
|
|
|
|
|
|
|
|
|
// return if encoding found, string matches encoding and convert succeeded
|
|
|
|
// return if encoding found, string matches encoding and convert succeeded
|
|
|
|
if (in_array($mb_from, $mbstring_list) && in_array($mb_to, $mbstring_list)) {
|
|
|
|
if (in_array($mb_from, $mbstring_list) && in_array($mb_to, $mbstring_list)) {
|
|
|
|
if (mb_check_encoding($str, $mb_from) && ($out = mb_convert_encoding($str, $mb_to, $mb_from))) {
|
|
|
|
if (mb_check_encoding($str, $mb_from)) {
|
|
|
|
return $out;
|
|
|
|
// Do the same as //IGNORE with iconv
|
|
|
|
|
|
|
|
mb_substitute_character('none');
|
|
|
|
|
|
|
|
$out = mb_convert_encoding($str, $mb_to, $mb_from);
|
|
|
|
|
|
|
|
mb_substitute_character($mbstring_sch);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($out !== false) {
|
|
|
|
|
|
|
|
return $out;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -646,14 +659,14 @@ class rcube_charset
|
|
|
|
return $failover;
|
|
|
|
return $failover;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// FIXME: the order is important, because sometimes
|
|
|
|
// FIXME: the order is important, because sometimes
|
|
|
|
// iso string is detected as euc-jp and etc.
|
|
|
|
// iso string is detected as euc-jp and etc.
|
|
|
|
$enc = array(
|
|
|
|
$enc = array(
|
|
|
|
'UTF-8', 'SJIS', 'BIG5', 'GB2312',
|
|
|
|
'UTF-8', 'SJIS', 'BIG5', 'GB2312',
|
|
|
|
'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4',
|
|
|
|
'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4',
|
|
|
|
'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9',
|
|
|
|
'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9',
|
|
|
|
'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
|
|
|
|
'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16',
|
|
|
|
'WINDOWS-1252', 'WINDOWS-1251', 'EUC-JP', 'EUC-TW', 'KOI8-R',
|
|
|
|
'WINDOWS-1252', 'WINDOWS-1251', 'EUC-JP', 'EUC-TW', 'KOI8-R',
|
|
|
|
'ISO-2022-KR', 'ISO-2022-JP'
|
|
|
|
'ISO-2022-KR', 'ISO-2022-JP'
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|