/** * */ public function import($csv) { // convert to UTF-8 $head = substr($csv, 0, 4096); $fallback = rcube::get_instance()->config->get('default_charset', 'ISO-8859-1'); // fallback to Latin-1? $charset = rcube_charset::detect($head, RCUBE_CHARSET); $csv = rcube_charset::convert($csv, $charset); $head = ''; $this->map = array(); // Parse file foreach (preg_split("/[\r\n]+/", $csv) as $i => $line) { $elements = $this->parse_line($line); if (empty($elements)) { continue; } // Parse header if (empty($this->map)) { $this->parse_header($elements); if (empty($this->map)) { break; } } else { $this->csv_to_vcard($elements); } } }
/** * */ public function import($csv) { // convert to UTF-8 $head = substr($csv, 0, 4096); $charset = rcube_charset::detect($head, RCUBE_CHARSET); $csv = rcube_charset::convert($csv, $charset); $head = ''; $this->map = array(); // Parse file foreach (preg_split("/[\r\n]+/", $csv) as $line) { $elements = $this->parse_line($line); if (empty($elements)) { continue; } // Parse header if (empty($this->map)) { $this->parse_header($elements); if (empty($this->map)) { break; } } else { $this->csv_to_vcard($elements); } } }
/** * */ public function import($csv) { // convert to UTF-8 $head = substr($csv, 0, 4096); $charset = rcube_charset::detect($head, RCUBE_CHARSET); $csv = rcube_charset::convert($csv, $charset); $csv = preg_replace(array('/^[\\xFE\\xFF]{2}/', '/^\\xEF\\xBB\\xBF/', '/^\\x00+/'), '', $csv); // also remove BOM $head = ''; $prev_line = false; $this->map = array(); $this->gmail_map = array(); // Parse file foreach (preg_split("/[\r\n]+/", $csv) as $line) { if (!empty($prev_line)) { $line = '"' . $line; } $elements = $this->parse_line($line); if (empty($elements)) { continue; } // Parse header if (empty($this->map)) { $this->parse_header($elements); if (empty($this->map)) { break; } } else { // handle multiline elements (e.g. Gmail) if (!empty($prev_line)) { $first = array_shift($elements); if ($first[0] == '"') { $prev_line[count($prev_line) - 1] = '"' . $prev_line[count($prev_line) - 1] . "\n" . substr($first, 1); } else { $prev_line[count($prev_line) - 1] .= "\n" . $first; } $elements = array_merge($prev_line, $elements); } $last_element = $elements[count($elements) - 1]; if ($last_element[0] == '"') { $elements[count($elements) - 1] = substr($last_element, 1); $prev_line = $elements; continue; } $this->csv_to_vcard($elements); $prev_line = false; } } }
/** * Set attachment filename from message part structure * * @param rcube_message_part $part Part object * @param string $headers Part's raw headers */ protected function set_part_filename(&$part, $headers = null) { if (!empty($part->d_parameters['filename'])) { $filename_mime = $part->d_parameters['filename']; } else { if (!empty($part->d_parameters['filename*'])) { $filename_encoded = $part->d_parameters['filename*']; } else { if (!empty($part->ctype_parameters['name*'])) { $filename_encoded = $part->ctype_parameters['name*']; } else { if (!empty($part->d_parameters['filename*0'])) { $i = 0; while (isset($part->d_parameters['filename*' . $i])) { $filename_mime .= $part->d_parameters['filename*' . $i]; $i++; } // some servers (eg. dovecot-1.x) have no support for parameter value continuations // we must fetch and parse headers "manually" if ($i < 2) { if (!$headers) { $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id); } $filename_mime = ''; $i = 0; while (preg_match('/filename\\*' . $i . '\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) { $filename_mime .= $matches[1]; $i++; } } } else { if (!empty($part->d_parameters['filename*0*'])) { $i = 0; while (isset($part->d_parameters['filename*' . $i . '*'])) { $filename_encoded .= $part->d_parameters['filename*' . $i . '*']; $i++; } if ($i < 2) { if (!$headers) { $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id); } $filename_encoded = ''; $i = 0; $matches = array(); while (preg_match('/filename\\*' . $i . '\\*\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) { $filename_encoded .= $matches[1]; $i++; } } } else { if (!empty($part->ctype_parameters['name*0'])) { $i = 0; while (isset($part->ctype_parameters['name*' . $i])) { $filename_mime .= $part->ctype_parameters['name*' . $i]; $i++; } if ($i < 2) { if (!$headers) { $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id); } $filename_mime = ''; $i = 0; $matches = array(); while (preg_match('/\\s+name\\*' . $i . '\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) { $filename_mime .= $matches[1]; $i++; } } } else { if (!empty($part->ctype_parameters['name*0*'])) { $i = 0; while (isset($part->ctype_parameters['name*' . $i . '*'])) { $filename_encoded .= $part->ctype_parameters['name*' . $i . '*']; $i++; } if ($i < 2) { if (!$headers) { $headers = $this->conn->fetchPartHeader($this->folder, $this->msg_uid, true, $part->mime_id); } $filename_encoded = ''; $i = 0; $matches = array(); while (preg_match('/\\s+name\\*' . $i . '\\*\\s*=\\s*"*([^"\\n;]+)[";]*/', $headers, $matches)) { $filename_encoded .= $matches[1]; $i++; } } } else { if (!empty($part->ctype_parameters['name'])) { $filename_mime = $part->ctype_parameters['name']; } else { if (!empty($part->headers['content-description'])) { $filename_mime = $part->headers['content-description']; } else { return; } } } } } } } } } // decode filename if (!empty($filename_mime)) { if (!empty($part->charset)) { $charset = $part->charset; } else { if (!empty($this->struct_charset)) { $charset = $this->struct_charset; } else { $charset = rcube_charset::detect($filename_mime, $this->default_charset); } } $part->filename = rcube_mime::decode_mime_string($filename_mime, $charset); } else { if (!empty($filename_encoded)) { // decode filename according to RFC 2231, Section 4 if (preg_match("/^([^']*)'[^']*'(.*)\$/", $filename_encoded, $fmatches)) { $filename_charset = $fmatches[1]; $filename_encoded = $fmatches[2]; } $part->filename = rcube_charset::convert(urldecode($filename_encoded), $filename_charset); } } }
/** * Fix attachment name encoding if needed/possible */ protected function fix_attachment_name($name, $part) { if ($name == rcube_charset::clean($name)) { return $name; } // find charset from part or its parent(s) if ($part->charset) { $charsets[] = $part->charset; } else { // check first part (common case) $n = strpos($part->mime_id, '.') ? preg_replace('/\\.[0-9]+$/', '', $part->mime_id) . '.1' : 1; if (($_part = $this->mime_parts[$n]) && $_part->charset) { $charsets[] = $_part->charset; } // check parents' charset $items = explode('.', $part->mime_id); for ($i = count($items) - 1; $i > 0; $i--) { $last = array_pop($items); $parent = $this->mime_parts[join('.', $items)]; if ($parent && $parent->charset) { $charsets[] = $parent->charset; } } } if ($this->headers->charset) { $charsets[] = $this->headers->charset; } if (empty($charsets)) { $rcube = rcube::get_instance(); $charsets[] = rcube_charset::detect($name, $rcube->config->get('default_charset', RCUBE_CHARSET)); } foreach (array_unique($charsets) as $charset) { $_name = rcube_charset::convert($name, $charset); if ($_name == rcube_charset::clean($_name)) { if (!$part->charset) { $part->charset = $charset; } return $_name; } } return $name; }
/** * Returns UNICODE type based on BOM (Byte Order Mark) * * @param string Input string to test * @return string Detected encoding */ private static function detect_encoding($string) { $fallback = rcube::get_instance()->config->get('default_charset', 'ISO-8859-1'); // fallback to Latin-1 return rcube_charset::detect($string, $fallback); }
function rc_detect_encoding($string, $failover = '') { return rcube_charset::detect($string, $failover); }
/** * @dataProvider data_detect */ function test_detect($input, $fallback, $output) { $this->assertEquals($output, rcube_charset::detect($input, $fallback)); }
function rc_detect_encoding($string, $failover = '') { _deprecation_warning(__FUNCTION__); return rcube_charset::detect($string, $failover); }