thomascube
2007-08-10 b8e65ce39b5330fb99371c9dc039f8d19f39477d
Fix charset converting issues with iconv and mbstring

2 files modified
35 ■■■■■ changed files
CHANGELOG 3 ●●●●● patch | view | raw | blame | history
program/include/main.inc 32 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -9,6 +9,9 @@
- 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
program/include/main.inc
@@ -472,9 +472,17 @@
  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 rcube_charset_convert($str, $from, $to=NULL)
  {
  global $MBSTRING;
  static $mb_encodings;
  $from = strtoupper($from);
  $to = $to==NULL ? strtoupper(RCMAIL_CHARSET) : strtoupper($to);
@@ -1056,20 +1065,17 @@
  if ($from==$to || $str=='' || empty($from))
    return $str;
  // convert charset using mbstring module
  if ($MBSTRING)
    {
    $to = $to=="UTF-7" ? "UTF7-IMAP" : $to;
    $from = $from=="UTF-7" ? "UTF7-IMAP": $from;
  // 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 && ($mbfrom = $MBSTRING[$from]) && ($mbto = $MBSTRING[$to]))
    {
    // 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();