+ elsif ($word =~ /^[\s\n]$/) {
+ $string = $word.$string;
+ $previous_word_encoded = 0 if $word eq "\n";
+ }
+ else {
+ my $encoded = MIME::Words::encode_mimeword($word, 'q', 'UTF-8');
+ # RFC 1522 mandates that segments be at most 76 characters
+ # long. If that's the case, we split the word up into 10
+ # character pieces and encode it. We must use the Encode
+ # magic here to avoid breaking on bit boundaries here.
+ if (length $encoded > 75) {
+ # Turn utf8 into the internal perl representation
+ # so . is a character, not a byte.
+ my $tempstr = is_utf8($word)?$word:decode_utf8($word,Encode::FB_DEFAULT);
+ my @encoded;
+ # Strip it into 10 character long segments, and encode
+ # the segments
+ # XXX It's possible that these segments are > 76 characters
+ while ($tempstr =~ s/(.{1,10})$//) {
+ # turn the character back into the utf8 representation.
+ my $tempword = encode_utf8($1);
+ # It may actually be better to eventually use
+ # the base64 encoding here, but I'm not sure
+ # if that's as widely supported as quoted
+ # printable.
+ unshift @encoded, MIME::Words::encode_mimeword($tempword,'q','UTF-8');
+ }
+ $encoded = join(" ",@encoded);
+ # If the previous word was encoded, we must
+ # include a trailing _ that gets encoded as a
+ # space.
+ $encoded =~ s/\?\=$/_\?\=/ if $previous_word_encoded;
+ $string = $encoded.$string;
+ }
+ else {
+ # If the previous word was encoded, we must
+ # include a trailing _ that gets encoded as a
+ # space.
+ $encoded =~ s/\?\=$/_\?\=/ if $previous_word_encoded;
+ $string = $encoded.$string;
+ }
+ $previous_word_encoded = 1;
+ }
+ }
+ return $string;