diff options
| -rw-r--r-- | CHANGELOG | 1 | ||||
| -rw-r--r-- | program/include/main.inc | 37 | 
2 files changed, 34 insertions, 4 deletions
| @@ -1,6 +1,7 @@  CHANGELOG RoundCube Webmail  =========================== +- Fix character set conversion fails on systems where iconv doesn't accept //IGNORE (#1486375)  - Login preformance: Create default folders on first login only  - Import contacts into the selected address book (by Phil Weir)  - Add support for MDB2's 'sqlsrv' driver (#1486395) diff --git a/program/include/main.inc b/program/include/main.inc index 36d39085d..31e4ab558 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -170,6 +170,18 @@ function rcmail_cache_gc()  /** + * Catch an error and throw an exception. + * + * @param  int    Level of the error + * @param  string Error message + */  +function rcube_error_handler($errno, $errstr) +  { +  throw new ErrorException($errstr, 0, $errno); +  } + + +/**   * Convert a string from one charset to another.   * Uses mbstring and iconv functions if possible   * @@ -180,6 +192,7 @@ function rcmail_cache_gc()   */  function rcube_charset_convert($str, $from, $to=NULL)    { +  static $iconv_options = null;    static $mbstring_loaded = null;    static $mbstring_list = null;    static $convert_warning = false; @@ -195,20 +208,36 @@ function rcube_charset_convert($str, $from, $to=NULL)    // convert charset using iconv module      if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') { -    $_iconv = @iconv($from, $to . '//IGNORE', $str); +    if ($iconv_options === null) { +      // transliterate characters not available in output charset +      $iconv_options = '//TRANSLIT'; +      if (iconv('', $iconv_options, '') === false) { +        // iconv implementation does not support options +        $iconv_options = ''; +      } +    } +    // throw an exception if iconv reports an illegal character in input +    // it means that input string has been truncated +    set_error_handler('rcube_error_handler', E_NOTICE); +    try { +      $_iconv = iconv($from, $to . $iconv_options, $str); +    } catch (ErrorException $e) { +      $_iconv = false; +    } +    restore_error_handler();      if ($_iconv !== false) { -        return $_iconv; +      return $_iconv;      }    } -  if (is_null($mbstring_loaded)) +  if ($mbstring_loaded === null)      $mbstring_loaded = extension_loaded('mbstring');    // convert charset using mbstring module    if ($mbstring_loaded) {      $aliases['WINDOWS-1257'] = 'ISO-8859-13'; -    if (is_null($mbstring_list)) { +    if ($mbstring_list === null) {        $mbstring_list = mb_list_encodings();        $mbstring_list = array_map('strtoupper', $mbstring_list);      } | 
