| | |
| | | | Copyright (C) 2005-2012, The Roundcube Dev Team | |
| | | | Copyright (C) 2011-2012, Kolab Systems AG | |
| | | | Copyright (C) 2000 Edmund Grimley Evans <edmundo@rano.org> | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | | | See the README file for a full license statement. | |
| | | | | |
| | | | PURPOSE: | |
| | | | Provide charset conversion functionality | |
| | |
| | | | Author: Thomas Bruederli <roundcube@gmail.com> | |
| | | | Author: Aleksander Machniak <alec@alec.pl> | |
| | | +-----------------------------------------------------------------------+ |
| | | |
| | | $Id$ |
| | | |
| | | */ |
| | | |
| | | /** |
| | |
| | | 'UNKNOWN' => 'ISO-8859-15', |
| | | 'USERDEFINED' => 'ISO-8859-15', |
| | | 'KSC56011987' => 'EUC-KR', |
| | | 'GB2312' => 'GBK', |
| | | 'GB231280' => 'GBK', |
| | | 'UNICODE' => 'UTF-8', |
| | | 'UTF7IMAP' => 'UTF7-IMAP', |
| | | 'TIS620' => 'WINDOWS-874', |
| | | 'ISO88599' => 'WINDOWS-1254', |
| | | 'ISO885911' => 'WINDOWS-874', |
| | | 'MACROMAN' => 'MACINTOSH', |
| | | 'GB2312' => 'GBK', |
| | | 'GB231280' => 'GBK', |
| | | 'UNICODE' => 'UTF-8', |
| | | 'UTF7IMAP' => 'UTF7-IMAP', |
| | | 'TIS620' => 'WINDOWS-874', |
| | | 'ISO88599' => 'WINDOWS-1254', |
| | | 'ISO885911' => 'WINDOWS-874', |
| | | 'MACROMAN' => 'MACINTOSH', |
| | | '77' => 'MAC', |
| | | '128' => 'SHIFT-JIS', |
| | | '129' => 'CP949', |
| | |
| | | * @param int Level of the error |
| | | * @param string Error message |
| | | */ |
| | | public function error_handler($errno, $errstr) |
| | | public static function error_handler($errno, $errstr) |
| | | { |
| | | throw new ErrorException($errstr, 0, $errno); |
| | | } |
| | |
| | | * |
| | | * @return string The validated charset name |
| | | */ |
| | | public static function parse($input) |
| | | public static function parse_charset($input) |
| | | { |
| | | static $charsets = array(); |
| | | $charset = strtoupper($input); |
| | |
| | | public static function convert($str, $from, $to = null) |
| | | { |
| | | static $iconv_options = null; |
| | | static $mbstring_loaded = null; |
| | | static $mbstring_list = null; |
| | | static $conv = null; |
| | | |
| | | $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : self::parse($to); |
| | | $from = self::parse($from); |
| | | $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : self::parse_charset($to); |
| | | $from = self::parse_charset($from); |
| | | |
| | | if ($from == $to || empty($str) || empty($from)) { |
| | | return $str; |
| | | } |
| | | |
| | | // convert charset using iconv module |
| | | if (function_exists('iconv') && $from != 'UTF7-IMAP' && $to != 'UTF7-IMAP') { |
| | | if ($iconv_options === null) { |
| | | if ($iconv_options === null) { |
| | | if (function_exists('iconv')) { |
| | | // ignore characters not available in output charset |
| | | $iconv_options = '//IGNORE'; |
| | | if (iconv('', $iconv_options, '') === false) { |
| | |
| | | $iconv_options = ''; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // convert charset using iconv module |
| | | if ($iconv_options !== null && $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); |
| | |
| | | } |
| | | } |
| | | |
| | | if ($mbstring_loaded === null) { |
| | | $mbstring_loaded = extension_loaded('mbstring'); |
| | | } |
| | | |
| | | // convert charset using mbstring module |
| | | if ($mbstring_loaded) { |
| | | $aliases['WINDOWS-1257'] = 'ISO-8859-13'; |
| | | |
| | | if ($mbstring_list === null) { |
| | | if ($mbstring_list === null) { |
| | | if (extension_loaded('mbstring')) { |
| | | $mbstring_list = mb_list_encodings(); |
| | | $mbstring_list = array_map('strtoupper', $mbstring_list); |
| | | } |
| | | } |
| | | |
| | | // convert charset using mbstring module |
| | | if ($mbstring_list !== null) { |
| | | $aliases['WINDOWS-1257'] = 'ISO-8859-13'; |
| | | |
| | | $mb_from = $aliases[$from] ? $aliases[$from] : $from; |
| | | $mb_to = $aliases[$to] ? $aliases[$to] : $to; |
| | |
| | | if ($from == 'UTF-8') { |
| | | // @TODO: we need a function for UTF-7 (RFC2152) conversion |
| | | if ($to == 'UTF7-IMAP' || $to == 'UTF-7') { |
| | | if ($_str = utf8_to_utf7imap($str)) { |
| | | if ($_str = self::utf8_to_utf7imap($str)) { |
| | | return $_str; |
| | | } |
| | | } |
| | |
| | | break; |
| | | } |
| | | |
| | | $ch .= $u7; |
| | | $ch .= $u7; |
| | | } |
| | | |
| | | if ($ch == '') { |
| | |
| | | } |
| | | else if ($ord >= 0xC0) { |
| | | if (strlen($seq) > 1) { |
| | | $out .= preg_match($regexp, $seq) ? $seq : ''; |
| | | $out .= preg_match($regexp, $seq) ? $seq : ''; |
| | | $seq = ''; |
| | | } |
| | | else if ($seq && ord($seq) < 0xC0) { |