Aleksander Machniak
2014-10-18 ced34cb15e095836767971aa4d27b141fb1d7ec9
program/lib/Roundcube/rcube_charset.php
@@ -199,10 +199,13 @@
                    $iconv_options = '';
                }
            }
            else {
                $iconv_options = false;
            }
        }
        // convert charset using iconv module
        if ($iconv_options !== null && $from != 'UTF7-IMAP' && $to != 'UTF7-IMAP') {
        if ($iconv_options !== false && $from != 'UTF7-IMAP' && $to != 'UTF7-IMAP') {
            // throw an exception if iconv reports an illegal character in input
            // it means that input string has been truncated
            set_error_handler(array('rcube_charset', 'error_handler'), E_NOTICE);
@@ -224,10 +227,13 @@
                $mbstring_list = mb_list_encodings();
                $mbstring_list = array_map('strtoupper', $mbstring_list);
            }
            else {
                $mbstring_list = false;
            }
        }
        // convert charset using mbstring module
        if ($mbstring_list !== null) {
        if ($mbstring_list !== false) {
            $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)) {
@@ -267,17 +273,8 @@
            else if ($from == 'ISO-8859-1' && function_exists('utf8_encode')) {
                return utf8_encode($str);
            }
            else if (class_exists('utf8')) {
                if (!$conv) {
                    $conv = new utf8($from);
                }
                else {
                    $conv->loadCharset($from);
                }
                if ($_str = $conv->strToUtf8($str)) {
                    return $_str;
                }
            else  {
                user_error("No suitable function found for UTF-8 encoding", E_USER_WARNING);
            }
        }
@@ -292,17 +289,8 @@
            else if ($to == 'ISO-8859-1' && function_exists('utf8_decode')) {
                return utf8_decode($str);
            }
            else if (class_exists('utf8')) {
                if (!$conv) {
                    $conv = new utf8($to);
                }
                else {
                    $conv->loadCharset($from);
                }
                if ($_str = $conv->strToUtf8($str)) {
                    return $_str;
                }
            else {
                user_error("No suitable function found for UTF-8 decoding", E_USER_WARNING);
            }
        }
@@ -674,21 +662,25 @@
            // Prioritize charsets according to current language (#1485669)
            switch ($language) {
            case 'ja_JP': // for Japanese
            case 'ja_JP':
                $prio = array('ISO-2022-JP', 'JIS', 'UTF-8', 'EUC-JP', 'eucJP-win', 'SJIS', 'SJIS-win');
                break;
            case 'zh_CN': // for Chinese (Simplified)
            case 'zh_TW': // for Chinese (Traditional)
            case 'zh_CN':
            case 'zh_TW':
                $prio = array('UTF-8', 'BIG-5', 'GB2312', 'EUC-TW');
                break;
            case 'ko_KR': // for Korean
            case 'ko_KR':
                $prio = array('UTF-8', 'EUC-KR', 'ISO-2022-KR');
                break;
            case 'ru_RU': // for Russian
            case 'ru_RU':
                $prio = array('UTF-8', 'WINDOWS-1251', 'KOI8-R');
                break;
            case 'tr_TR':
                $prio = array('UTF-8', 'ISO-8859-9', 'WINDOWS-1254');
                break;
            default:
@@ -749,7 +741,12 @@
        // iconv/mbstring are much faster (especially with long strings)
        if (function_exists('mb_convert_encoding')) {
            if (($res = mb_convert_encoding($input, 'UTF-8', 'UTF-8')) !== false) {
            $msch = mb_substitute_character('none');
            mb_substitute_character('none');
            $res = mb_convert_encoding($input, 'UTF-8', 'UTF-8');
            mb_substitute_character($msch);
            if ($res !== false) {
                return $res;
            }
        }
@@ -785,8 +782,8 @@
                }
                $seq = '';
                $out .= $chr;
            // first (or second) byte of multibyte sequence
            }
            // first (or second) byte of multibyte sequence
            else if ($ord >= 0xC0) {
                if (strlen($seq) > 1) {
                    $out .= preg_match($regexp, $seq) ? $seq : '';
@@ -796,8 +793,8 @@
                    $seq = '';
                }
                $seq .= $chr;
            // next byte of multibyte sequence
            }
            // next byte of multibyte sequence
            else if ($seq) {
                $seq .= $chr;
            }