Fix charset converting issues with iconv and mbstring

release-0.6
thomascube 17 years ago
parent e715986455
commit b8e65ce39b

@ -9,6 +9,9 @@ CHANGELOG RoundCube Webmail
- Protect AJAX request from being fetched by a foreign site (XSS)
- Make autocomplete for loginform configurable by the skin template
- Fix compose function from address book (closes #1484426)
- Added //IGNORE to iconv call (patch #1484420, closes #1484023)
- Check if mbstring supports charset (#1484290 and #1484292)
- Prefer iconv over mbstring (as suggested in #1484292)
- Updated Simplified Chinese localization
- Added Ukrainian translation

@ -472,9 +472,17 @@ function rcmail_set_locale($lang)
static $s_mbstring_loaded = NULL;
// settings for mbstring module (by Tadashi Jokagi)
if (is_null($s_mbstring_loaded))
$MBSTRING = $s_mbstring_loaded = extension_loaded("mbstring");
else
if (is_null($s_mbstring_loaded) && ($s_mbstring_loaded = extension_loaded("mbstring")))
{
$MBSTRING = array();
foreach (mb_list_encodings() as $charset)
$MBSTRING[strtoupper($charset)] = strtoupper($charset);
// add some alias charsets
$MBSTRING['UTF-7'] = "UTF7-IMAP";
$MBSTRING['WINDOWS-1257'] = "ISO-8859-13";
}
else if (is_null($s_mbstring_loaded))
$MBSTRING = $s_mbstring_loaded = FALSE;
if ($MBSTRING)
@ -1049,6 +1057,7 @@ function rcmail_message_cache_gc()
function rcube_charset_convert($str, $from, $to=NULL)
{
global $MBSTRING;
static $mb_encodings;
$from = strtoupper($from);
$to = $to==NULL ? strtoupper(RCMAIL_CHARSET) : strtoupper($to);
@ -1056,21 +1065,18 @@ function rcube_charset_convert($str, $from, $to=NULL)
if ($from==$to || $str=='' || empty($from))
return $str;
// convert charset using iconv module
if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7')
return iconv($from, $to . "//IGNORE", $str);
// convert charset using mbstring module
if ($MBSTRING)
if ($MBSTRING && ($mbfrom = $MBSTRING[$from]) && ($mbto = $MBSTRING[$to]))
{
$to = $to=="UTF-7" ? "UTF7-IMAP" : $to;
$from = $from=="UTF-7" ? "UTF7-IMAP": $from;
// return if convert succeeded
if (($out = mb_convert_encoding($str, $to, $from)) != '')
if (($out = mb_convert_encoding($str, $mbto, $mbfrom)) != '')
return $out;
}
// convert charset using iconv module
if (function_exists('iconv') && $from!='UTF-7' && $to!='UTF-7')
return iconv($from, $to, $str);
$conv = new utf8();
// convert string to UTF-8

Loading…
Cancel
Save