Switched to full UTF-8 support

release-0.6
thomascube 19 years ago
parent c030955634
commit 3f9edb4c3e

@ -289,7 +289,7 @@ function rcube_language_prop($lang, $prop='lang')
// init output object for GUI and add common scripts // init output object for GUI and add common scripts
function load_gui() function load_gui()
{ {
global $CONFIG, $OUTPUT, $COMM_PATH, $JS_OBJECT_NAME, $CHARSET, $sess_user_lang; global $CONFIG, $OUTPUT, $COMM_PATH, $JS_OBJECT_NAME, $sess_user_lang;
// init output page // init output page
$OUTPUT = new rcube_html_page(); $OUTPUT = new rcube_html_page();
@ -307,14 +307,9 @@ function load_gui()
// set user-selected charset // set user-selected charset
if (!empty($CONFIG['charset'])) if (!empty($CONFIG['charset']))
{
$OUTPUT->set_charset($CONFIG['charset']); $OUTPUT->set_charset($CONFIG['charset']);
$CHARSET = $CONFIG['charset'];
}
else else
{
rcmail_set_locale($sess_user_lang); rcmail_set_locale($sess_user_lang);
}
// add some basic label to client // add some basic label to client
rcube_add_label('loading'); rcube_add_label('loading');
@ -324,10 +319,8 @@ function load_gui()
// set localization charset based on the given language // set localization charset based on the given language
function rcmail_set_locale($lang) function rcmail_set_locale($lang)
{ {
global $OUTPUT, $CHARSET; global $OUTPUT;
$OUTPUT->set_charset(rcube_language_prop($lang, 'charset'));
$CHARSET = rcube_language_prop($lang, 'charset');
$OUTPUT->set_charset($CHARSET);
} }
@ -704,39 +697,46 @@ function rcmail_clear_session_temp($sess_id)
// decode characters from any charset to UTF-8 // convert a string from one charset to another
function decode_specialchars($input, $charset='') // this function is not complete and not tested well
function rcube_charset_convert($str, $from, $to=NULL)
{ {
global $CHARSET; $from = strtolower($from);
$charset = strtolower($charset); $to = $to==NULL ? strtolower($GLOBALS['CHARSET']) : strtolower($to);
if ($charset=='utf-7') if ($from==$to)
$output = UTF7DecodeString($input); return $str;
else if ($charset=='utf-8' && $CHARSET!='UTF-8' && function_exists('utf8_decode'))
$output = utf8_decode($input); // decode characters
else if ($charset=="koi8-r") if ($from=='utf-7')
$output = convert_cyr_string($input, 'k', 'w'); $str = UTF7DecodeString($str);
else if ($charset=="iso8859-5") else if ($from=='utf-8' && function_exists('utf8_decode'))
$output = convert_cyr_string($input, 'i', 'w'); $str = utf8_decode($str);
else if ($charset=="x-cp866") else if ($from=="koi8-r")
$output = convert_cyr_string($input, 'a', 'w'); $str = convert_cyr_string($str, 'k', 'i');
else if ($charset=="x-mac-cyrillic") else if ($from=="windows-1251" || $from=="win-1251")
$output = convert_cyr_string($input, 'm', 'w'); $str = convert_cyr_string($str, 'w', 'i');
else else if ($from=="x-cp866")
$output = $input; $str = convert_cyr_string($str, 'a', 'i');
else if ($from=="x-mac-cyrillic")
$str = convert_cyr_string($str, 'm', 'i');
// encode string for output // encode string for output
if ($CHARSET=='UTF-8' && $charset!='utf-8' && function_exists('utf8_encode')) if ($to=='utf-8' && function_exists('utf8_encode'))
$output = utf8_encode($output); return utf8_encode($str);
else if ($to=='utf-7')
return UTF7EncodeString($str);
return $output; // return raw string
return $str;
} }
// replace specials characters to a specific encoding type // replace specials characters to a specific encoding type
function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE) function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
{ {
global $OUTPUT_TYPE, $CHARSET; global $OUTPUT_TYPE, $OUTPUT;
static $html_encode_arr, $js_rep_table, $rtf_rep_table, $xml_rep_table; static $html_encode_arr, $js_rep_table, $rtf_rep_table, $xml_rep_table;
if (!$enctype) if (!$enctype)
@ -794,7 +794,7 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
$rtf_rep_table[Chr($c)] = "\\'$hex"; $rtf_rep_table[Chr($c)] = "\\'$hex";
$xml_rep_table[Chr($c)] = "&#$c;"; $xml_rep_table[Chr($c)] = "&#$c;";
if ($CHARSET=='ISO-8859-1') if ($OUTPUT->get_charset()=='ISO-8859-1')
$js_rep_table[Chr($c)] = sprintf("\u%s%s", str_repeat('0', 4-strlen($hex)), $hex); $js_rep_table[Chr($c)] = sprintf("\u%s%s", str_repeat('0', 4-strlen($hex)), $hex);
} }
@ -819,26 +819,6 @@ function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE)
} }
// convert a string from one charset to another
// this function is not complete and not tested well
function rcube_charset_convert($str, $from, $to)
{
$charset = strtolower($to);
if (strtolower($from)==$charset)
return $str;
$str = decode_specialchars($str, $from);
if ($charset=='utf-8' && function_exists('utf8_encode'))
return utf8_encode($str);
else if ($charset=='utf-7')
return UTF7EncodeString($str);
return $str;
}
// ************** template parsing and gui functions ************** // ************** template parsing and gui functions **************
@ -1022,7 +1002,7 @@ function rcube_xml_command($command, $str_attrib, $a_attrib=NULL)
else if (isset($GLOBALS['PAGE_TITLE'])) else if (isset($GLOBALS['PAGE_TITLE']))
$title .= $GLOBALS['PAGE_TITLE']; $title .= $GLOBALS['PAGE_TITLE'];
else if ($task=='mail' && ($mbox_name = $IMAP->get_mailbox_name())) else if ($task=='mail' && ($mbox_name = $IMAP->get_mailbox_name()))
$title .= $OUTPUT->encode_string(UTF7DecodeString($mbox_name)); $title .= rcube_charset_convert($mbox_name, 'UTF-7', 'UTF-8');
else else
$title .= $task; $title .= $task;

@ -70,7 +70,7 @@ class rcube_imap
*/ */
function __construct($db_conn) function __construct($db_conn)
{ {
$this->db = $db_conn; $this->db = $db_conn;
} }
@ -376,14 +376,28 @@ class rcube_imap
} }
// get message count for a specific mailbox; acceptes modes are: ALL, UNSEEN, RECENT /**
* Get message count for a specific mailbox
*
* @param string Mailbox/folder name
* @param string Mode for count [ALL|UNSEEN|RECENT]
* @param boolean Force reading from server and update cache
* @return number Number of messages
* @access public
*/
function messagecount($mbox='', $mode='ALL', $force=FALSE) function messagecount($mbox='', $mode='ALL', $force=FALSE)
{ {
$mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox; $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox;
return $this->_messagecount($mailbox, $mode, $force); return $this->_messagecount($mailbox, $mode, $force);
} }
// private method for getting nr of mesages
/**
* Private method for getting nr of messages
*
* @access private
* @see rcube_imap::messagecount
*/
function _messagecount($mailbox='', $mode='ALL', $force=FALSE) function _messagecount($mailbox='', $mode='ALL', $force=FALSE)
{ {
$a_mailbox_cache = FALSE; $a_mailbox_cache = FALSE;
@ -442,8 +456,17 @@ class rcube_imap
} }
// public method for listing headers /**
// convert mailbox name with root dir first * Public method for listing headers
* convert mailbox name with root dir first
*
* @param string Mailbox/folder name
* @param number Current page to list
* @param string Header field to sort by
* @param string Sort order [ASC|DESC]
* @return array Indexed array with message header objects
* @access public
*/
function list_headers($mbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL) function list_headers($mbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL)
{ {
$mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox; $mailbox = $mbox ? $this->_mod_mailbox($mbox) : $this->mailbox;
@ -451,7 +474,12 @@ class rcube_imap
} }
// private method for listing message header /**
* Private method for listing message header
*
* @access private
* @see rcube_imap::list_headers
*/
function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE) function _list_headers($mailbox='', $page=NULL, $sort_field=NULL, $sort_order=NULL, $recursive=FALSE)
{ {
if (!strlen($mailbox)) if (!strlen($mailbox))
@ -1548,10 +1576,10 @@ class rcube_imap
$rest = quoted_printable_decode($rest); $rest = quoted_printable_decode($rest);
} }
return decode_specialchars($rest, $a[0]); return rcube_charset_convert($rest, $a[0]);
} }
else else
return $str; //we dont' know what to do with this return $str; // we dont' know what to do with this
} }
@ -1599,7 +1627,7 @@ class rcube_imap
function charset_decode($body, $ctype_param) function charset_decode($body, $ctype_param)
{ {
if (is_array($ctype_param) && !empty($ctype_param['charset'])) if (is_array($ctype_param) && !empty($ctype_param['charset']))
return decode_specialchars($body, $ctype_param['charset']); return rcube_charset_convert($body, $ctype_param['charset']);
return $body; return $body;
} }

@ -88,13 +88,9 @@ class rcube_html_page
$this->charset = $charset; $this->charset = $charset;
} }
function get_charset()
function encode_string($str)
{ {
if ($this->charset=='UTF-8' && function_exists('utf8_encode')) return $this->charset;
return utf8_encode($str);
else
return $str;
} }
@ -187,7 +183,7 @@ class rcube_html_page
// correct absolute pathes in images and other tags // correct absolute pathes in images and other tags
$output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output); $output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output);
print $output; print rcube_charset_convert($output, 'UTF-8', $this->charset);
} }

@ -232,8 +232,10 @@ function rcube_webmail()
this.display_message(this.pending_message[0], this.pending_message[1]); this.display_message(this.pending_message[0], this.pending_message[1]);
// start interval for keep-alive/recent_check signal // start interval for keep-alive/recent_check signal
if (this.kepp_alive_interval) if (this.kepp_alive_interval && this.task=='mail' && this.gui_objects.messagelist)
this.kepp_alive_int = setInterval(this.ref+'.'+(this.task=='mail'?'check_for_recent()':'send_keep_alive()'), this.kepp_alive_interval); this.kepp_alive_int = setInterval(this.ref+'.check_for_recent()', this.kepp_alive_interval);
else
this.kepp_alive_int = setInterval(this.ref+'.send_keep_alive()', this.kepp_alive_interval);
}; };

@ -21,8 +21,6 @@
require_once('lib/html2text.inc'); require_once('lib/html2text.inc');
require_once('lib/enriched.inc'); require_once('lib/enriched.inc');
require_once('lib/utf8.inc');
require_once('lib/utf7.inc');
$EMAIL_ADDRESS_PATTERN = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/i'; $EMAIL_ADDRESS_PATTERN = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/i';
@ -148,7 +146,7 @@ function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
if (!isset($arrFolders[$currentFolder])) if (!isset($arrFolders[$currentFolder]))
{ {
$arrFolders[$currentFolder] = array('id' => $path, $arrFolders[$currentFolder] = array('id' => $path,
'name' => UTF7DecodeString($currentFolder), 'name' => rcube_charset_convert($currentFolder, 'UTF-7'),
'folders' => array()); 'folders' => array());
} }
@ -174,7 +172,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox, $maxlen
$foldername = rcube_label($folder_lc); $foldername = rcube_label($folder_lc);
else else
{ {
$foldername = $OUTPUT->encode_string($folder['name']); $foldername = $folder['name'];
// shorten the folder name to a given length // shorten the folder name to a given length
if ($maxlength && $maxlength>1) if ($maxlength && $maxlength>1)
@ -242,7 +240,7 @@ function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox, $maxl
$foldername = rcube_label($folder_lc); $foldername = rcube_label($folder_lc);
else else
{ {
$foldername = $OUTPUT->encode_string($folder['name']); $foldername = $folder['name'];
// shorten the folder name to a given length // shorten the folder name to a given length
if ($maxlength && $maxlength>1) if ($maxlength && $maxlength>1)

@ -80,9 +80,6 @@ if (empty($CHARSET))
$input_charset = $CHARSET; $input_charset = $CHARSET;
$message_charset = isset($_POST['_charset']) ? $_POST['_charset'] : $input_charset; $message_charset = isset($_POST['_charset']) ? $_POST['_charset'] : $input_charset;
// unset global var
$CHARSET = '';
$mailto_regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m'); $mailto_regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m');
$mailto_replace = array(', ', ', ', ''); $mailto_replace = array(', ', ', ', '');
@ -243,9 +240,6 @@ else
} }
// resore page charset
$CHARSET = $input_charset;
// return to compose page if sending failed // return to compose page if sending failed
if (!$sent) if (!$sent)
{ {

@ -19,8 +19,6 @@
*/ */
require_once('lib/utf7.inc');
// init IAMP connection // init IAMP connection
rcmail_imap_init(TRUE); rcmail_imap_init(TRUE);
@ -53,7 +51,7 @@ else if ($_action=='create-folder')
if ($create && $_GET['_remote']) if ($create && $_GET['_remote'])
{ {
$commands = sprintf("this.add_folder_row('%s')", $OUTPUT->encode_string(rep_specialchars_output($create, 'js'))); $commands = sprintf("this.add_folder_row('%s')", rep_specialchars_output($create, 'js'));
rcube_remote_response($commands); rcube_remote_response($commands);
} }
else if (!$create && $_GET['_remote']) else if (!$create && $_GET['_remote'])
@ -129,7 +127,7 @@ function rcube_subscription_form($attrib)
$out .= sprintf('<tr id="rcmrow%d" class="%s"><td>%s</td><td>%s</td><td><a href="#delete" onclick="%s.command(\'delete-folder\',\'%s\')" title="%s">%s</a></td>', $out .= sprintf('<tr id="rcmrow%d" class="%s"><td>%s</td><td>%s</td><td><a href="#delete" onclick="%s.command(\'delete-folder\',\'%s\')" title="%s">%s</a></td>',
$i+1, $i+1,
$zebra_class, $zebra_class,
$OUTPUT->encode_string(rep_specialchars_output(UTF7DecodeString($folder), 'html', 'all')), rep_specialchars_output(rcube_charset_convert($folder, 'UTF-7', 'UTF-8'), 'html', 'all'),
$checkbox_subscribe->show(in_array($folder, $a_subscribed)?$folder:'', array('value' => $folder)), $checkbox_subscribe->show(in_array($folder, $a_subscribed)?$folder:'', array('value' => $folder)),
$JS_OBJECT_NAME, $JS_OBJECT_NAME,
$folder_js, $folder_js,

Loading…
Cancel
Save