summaryrefslogtreecommitdiff
path: root/rt/lib/RT/I18N.pm
diff options
context:
space:
mode:
Diffstat (limited to 'rt/lib/RT/I18N.pm')
-rw-r--r--rt/lib/RT/I18N.pm22
1 files changed, 14 insertions, 8 deletions
diff --git a/rt/lib/RT/I18N.pm b/rt/lib/RT/I18N.pm
index c013c219e..79c3e8a15 100644
--- a/rt/lib/RT/I18N.pm
+++ b/rt/lib/RT/I18N.pm
@@ -164,10 +164,14 @@ sub SetMIMEEntityToEncoding {
my $charset = _FindOrGuessCharset($entity) or return;
# one and only normalization
- $charset = 'utf-8' if $charset eq 'utf8';
- $enc = 'utf-8' if $enc eq 'utf8';
+ $charset = 'utf-8' if $charset =~ /^utf-?8$/i;
+ $enc = 'utf-8' if $enc =~ /^utf-?8$/i;
- SetMIMEHeadToEncoding($entity->head, $charset => $enc, $preserve_words);
+ SetMIMEHeadToEncoding(
+ $entity->head,
+ _FindOrGuessCharset($entity, 1) => $enc,
+ $preserve_words
+ );
my $head = $entity->head;
@@ -302,24 +306,26 @@ sub DecodeMIMEWordsToEncoding {
# {{{ _FindOrGuessCharset
-=head2 _FindOrGuessCharset MIME::Entity
+=head2 _FindOrGuessCharset MIME::Entity, $head_only
+
+When handed a MIME::Entity will first attempt to read what charset the message is encoded in. Failing that, will use Encode::Guess to try to figure it out
-When handed a MIME::Entity will first attempt to read what charset the message is encoded in. Failing that,
-will use Encode::Guess to try to figure it out
+If $head_only is true, only guesses charset for head parts. This is because header's encoding (e.g. filename="...") may be different from that of body's.
=cut
sub _FindOrGuessCharset {
my $entity = shift;
+ my $head_only = shift;
my $head = $entity->head;
if ($head->mime_attr("content-type.charset")) {
return $head->mime_attr("content-type.charset");
}
- if ( $head->mime_type =~ m{^text/}) {
+ if ( !$head_only and $head->mime_type =~ m{^text/}) {
my $body = $entity->bodyhandle or return;
- return _GuessCharset( $head->as_string . $body->as_string );
+ return _GuessCharset( $body->as_string );
}
else {
# potentially binary data -- don't guess the body