2 # $Id: UTF7.pm,v 2.0 2004/05/16 20:55:17 dankogai Exp $
4 package Encode::Unicode::UTF7;
6 no warnings 'redefine';
7 use base qw(Encode::Encoding);
8 __PACKAGE__->Define('UTF-7');
9 our $VERSION = do { my @r = (q$Revision: 2.0 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
14 # Algorithms taken from Unicode::String by Gisle Aas
17 our $OPTIONAL_DIRECT_CHARS = 1;
18 my $specials = quotemeta "\'(),-./:?";
19 $OPTIONAL_DIRECT_CHARS and
20 $specials .= quotemeta "!\"#$%&*;<=>@[]^_`{|}";
21 # \s will not work because it matches U+3000 DEOGRAPHIC SPACE
22 # We use qr/[\n\r\t\ ] instead
23 my $re_asis = qr/(?:[\n\r\t\ A-Za-z0-9$specials])/;
24 my $re_encoded = qr/(?:[^\n\r\t\ A-Za-z0-9$specials])/;
25 my $e_utf16 = find_encoding("UTF-16BE");
27 sub needs_lines { 1 };
30 my ($obj, $str, $chk) = @_;
31 my $len = length($str);
34 while (pos($str) < $len){
35 if ($str =~ /\G($re_asis+)/ogc){
37 }elsif($str =~ /\G($re_encoded+)/ogsc){
41 my $base64 = encode_base64($e_utf16->encode($1), '');
43 $bytes .= "+$base64-";
46 die "This should not happen! (pos=" . pos($str) . ")";
54 my ($obj, $bytes, $chk) = @_;
55 my $len = length($bytes);
57 while (pos($bytes) < $len) {
58 if ($bytes =~ /\G([^+]+)/ogc) {
60 }elsif($bytes =~ /\G\+-/ogc) {
62 }elsif($bytes =~ /\G\+([A-Za-z0-9+\/]+)-?/ogsc) {
64 my $pad = length($base64) % 4;
65 $base64 .= "=" x (4 - $pad) if $pad;
66 $str .= $e_utf16->decode(decode_base64($base64));
67 }elsif($bytes =~ /\G\+/ogc) {
68 $^W and warn "Bad UTF7 data escape";
71 die "This should not happen " . pos($bytes);
82 Encode::Unicode::UTF7 -- UTF-7 encoding
86 use Encode qw/encode decode/;
87 $utf7 = encode("UTF-7", $utf8);
88 $utf8 = decode("UTF-7", $ucs2);
92 This module implements UTF-7 encoding documented in RFC 2152. UTF-7,
93 as its name suggests, is a 7-bit re-encoded version of UTF-16BE. It
94 is designed to be MTA-safe and expected to be a standard way to
95 exchange Unicoded mails via mails. But with the advent of UTF-8 and
96 8-bit compliant MTAs, UTF-7 is hardly ever used.
98 UTF-7 was not supported by Encode until version 1.95 because of that.
99 But Unicode::String, a module by Gisle Aas which adds Unicode supports
100 to non-utf8-savvy perl did support UTF-7, the UTF-7 support was added
101 so Encode can supersede Unicode::String 100%.
105 When you want to encode Unicode for mails and web pages, however, do
106 not use UTF-7 unless you are sure your recipients and readers can
107 handle it. Very few MUAs and WWW Browsers support these days (only
108 Mozilla seems to support one). For general cases, use UTF-8 for
109 message body and MIME-Header for header instead.
113 L<Encode>, L<Encode::Unicode>, L<Unicode::String>
115 RFC 2781 L<http://www.ietf.org/rfc/rfc2152.txt>