From bf80b5a237418621970a7c2bfd4f99c9373cb471 Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Thu, 14 Apr 2011 04:16:49 -0400 Subject: [PATCH] Fix vcard folding with uncode characters (#1487868) --- CHANGELOG | 1 + program/include/rcube_vcard.php | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 33e4be8..d2d3946 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix vcard folding with uncode characters (#1487868) - Keep all submitted data if contact form validation fails (#1487865) - Handle uncode strings in rcube_addressbook::normalize_string() (#1487866) - Fix bug where template name without plugin prefix was used in render_page hook diff --git a/program/include/rcube_vcard.php b/program/include/rcube_vcard.php index 81d4d11..25041ea 100644 --- a/program/include/rcube_vcard.php +++ b/program/include/rcube_vcard.php @@ -465,7 +465,26 @@ private static function rfc2425_fold_callback($matches) { - return ":\n ".rtrim(chunk_split($matches[1], 72, "\n ")); + // use mb string function if available + if (function_exists('mb_ereg_replace')) { + mb_internal_encoding(RCMAIL_CHARSET); + return ":\n " . mb_ereg_replace('(.{70})', "\\1\n ", $matches[1]); + } + + // chunk_split string and avoid lines breaking multibyte characters + $c = 66; + $out = ":\n " . substr($matches[1], 0, $c); + for ($n = $c; $c < strlen($matches[1]); $c++) { + // break if length > 70 or mutlibyte character starts after position 66 + if ($n > 70 || ($n > 66 && ord($matches[1][$c]) >> 6 == 3)) { + $out .= "\n "; + $n = 0; + } + $out .= $matches[1][$c]; + $n++; + } + + return $out; } private static function rfc2425_fold($val) -- Gitblit v1.9.1