/[suikacvs]/messaging/manakai/lib/Message/MIME/Charset/Jcode.pm
Suika

Contents of /messaging/manakai/lib/Message/MIME/Charset/Jcode.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations) (download)
Sat Jun 1 05:33:52 2002 UTC (24 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.1: +76 -7 lines
2002-06-01  wakaba <w@suika.fam.cx>

	* Jcode.pm: 
	- Returns minimum charset name.
	- Make-charset "junet" as an alias of ISO-2022-JP.

1 wakaba 1.1
2     =head1 NAME
3    
4     Message::MIME::Charset::Jcode --- Japanese Coding Systems Support
5     with jcode.pl and/or Jcode.pm for Message::* Perl Modules
6    
7     =head1 DESCRIPTION
8    
9     Message::* therselves don't convert coding systems of parts of
10     messages, but have mechanism to define to call external functions.
11     This module provides such macros for Japanese coding systems,
12     supported by jcode.pl and/or Jcode.pm.
13    
14     =cut
15    
16     package Message::MIME::Charset::Jcode;
17     use strict;
18     use vars qw(%CODE $VERSION);
19     $VERSION=do{my @r=(q$Revision: 1.1 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
20    
21     require Message::Util;
22     require Message::MIME::Charset;
23    
24     =head1 CODING SYSTEMS
25    
26     =over 4
27    
28     =item C<euc>
29    
30     Japanese EUC. (MIME: euc-jp)
31    
32     =item C<jis>
33    
34     7bit ISO/IEC 2022, so-called junet code. ASCII, JIS X 0201 Roman,
35     JIS X 0201 Katakana, JIS X 0208, JIS X 0212 are supported by
36     jcode.pl and Jcode.pm. ISO-2022-JP, ISO-2022-JP-1 are subsets of
37     junet code.
38    
39     =item C<sjis>
40    
41     Shift JIS. (MIME: Shift_JIS)
42    
43     =item C<utf8>
44    
45     UTF-8. (MIME: UTF-8) This coding system is not supported by jcode.pl.
46    
47     =item C<ucs2>
48    
49     UCS-2 (or Unicode without surrogate pairs) big endian (network
50     byte order). This coding system is not supported by jcode.pl.
51    
52     =back
53    
54     =head1 VARIABLES
55    
56     =over 4
57    
58     =item $Messag::MIME::Charset::Jcode::CODE{internal}
59    
60     Internal coding system. You can get strings written in this
61     coding system from Message::* Perl modules. (Default: C<euc>)
62    
63     =item $Messag::MIME::Charset::Jcode::CODE{input}
64    
65     Coding system of input string. (Default: auto-detect)
66    
67     =item $Messag::MIME::Charset::Jcode::CODE{output}
68    
69     Coding system of output string. (Default: C<jis>)
70    
71     =back
72    
73     =cut
74    
75     $CODE{internal} = 'euc';
76     $CODE{input} = '';
77     $CODE{output} = 'jis';
78    
79     sub import ($;%) {
80     shift;
81     for (@_) {
82     if ($_ eq 'jcode.pl') {
83     require 'jcode.pl';
84     Message::MIME::Charset::make_charset ('*default' =>
85     encoder => sub { jcode::to ($CODE{output}, $_[1], $CODE{internal}) },
86     decoder => sub { jcode::to ($CODE{internal}, $_[1], $CODE{input}) },
87     mime_text => 1,
88     );
89     Message::MIME::Charset::make_charset ('iso-2022-jp' =>
90 wakaba 1.2 encoder => sub {
91     my $s = jcode::jis ($_[1], $CODE{internal});
92     if ($s =~ /\x1B\x28[^BJ]|\x1B\x24\x28[^D]|\x1B\x24[^\x28\x40B]/) {
93     if ($s =~ /\x1B\x28[^B]|\x1B\x24[^\x28]|\x1B\x24\x28[^OP]/) {
94     ($s, charset => 'junet');
95     } elsif ($s =~ /\x1B\x24\x28P/) {
96     ($s, charset => 'iso-2022-jp-3');
97     } else {
98     ($s, charset => 'iso-2022-jp-3-plane1');
99     }
100     } elsif ($s =~ /\x1B\x24\x28D/) {
101     ($s, charset => 'iso-2022-jp-1');
102     } elsif ($s =~ /\x1B\x28[BJ]|\x1B\x24[\x40B]/) {
103     ($s, charset => 'iso-2022-jp');
104     } else {
105     ($s, charset => 'us-ascii');
106     }
107     },
108 wakaba 1.1 decoder => sub { jcode::to ($CODE{internal}, $_[1], 'jis') },
109     mime_text => 1,
110     cte_7bit_preferred => 'base64',
111     );
112     Message::MIME::Charset::make_charset ('euc-jp' =>
113 wakaba 1.2 encoder => sub {
114     my $s = jcode::euc ($_[1], $CODE{internal});
115     if ($s =~ /[\x80-\xFF]/) {
116     ($s, charset => 'euc-jp');
117     } else {
118     ($s, charset => 'us-ascii');
119     }
120     },
121 wakaba 1.1 decoder => sub { jcode::to ($CODE{internal}, $_[1], 'euc') },
122     mime_text => 1,
123     );
124     Message::MIME::Charset::make_charset (shift_jis =>
125 wakaba 1.2 encoder => sub {
126     my $s = jcode::sjis ($_[1], $CODE{internal});
127     if ($s =~ /[\x80-\xFF]/) {
128     ($s, charset => 'shift_jis');
129     } elsif ($s =~ /[\x5C\x7E]/) {
130     ($s, charset => 'jis_x0201');
131     } else {
132     ($s, charset => 'us-ascii');
133     }
134     },
135 wakaba 1.1 decoder => sub { jcode::to ($CODE{internal}, $_[1], 'sjis') },
136     mime_text => 1,
137     );
138     } elsif ($_ eq 'Jcode' || $_ eq 'Jcode.pm') {
139     require Jcode;
140     Message::MIME::Charset::make_charset ('*default' =>
141     ## Very tricky:-)
142     encoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{output}, $CODE{internal}); $s },
143     decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, $CODE{input}); $s },
144     mime_text => 1,
145     );
146     Message::MIME::Charset::make_charset ('iso-2022-jp' =>
147 wakaba 1.2 encoder => sub {
148     my $s = Jcode->new ($_[1], $CODE{internal})->iso_2022_jp;
149     if ($s =~ /\x1B\x28[^BJ]|\x1B\x24\x28[^D]|\x1B\x24[^\x28\x40B]/) {
150     if ($s =~ /\x1B\x28[^B]|\x1B\x24[^\x28]|\x1B\x24\x28[^OP]/) {
151     ($s, charset => 'junet');
152     } elsif ($s =~ /\x1B\x24\x28P/) {
153     ($s, charset => 'iso-2022-jp-3');
154     } else {
155     ($s, charset => 'iso-2022-jp-3-plane1');
156     }
157     } elsif ($s =~ /\x1B\x24\x28D/) {
158     ($s, charset => 'iso-2022-jp-1');
159     } elsif ($s =~ /\x1B\x28[BJ]|\x1B\x24[\x40B]/) {
160     ($s, charset => 'iso-2022-jp');
161     } else {
162     ($s, charset => 'us-ascii');
163     }
164     },
165 wakaba 1.1 decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'jis'); $s },
166     mime_text => 1,
167     cte_7bit_preferred => 'base64',
168     );
169     Message::MIME::Charset::make_charset ('euc-jp' =>
170 wakaba 1.2 encoder => sub {
171     my $s = Jcode->new ($_[1], $CODE{internal})->euc;
172     if ($s =~ /[\x80-\xFF]/) {
173     ($s, charset => 'euc-jp');
174     } else {
175     ($s, charset => 'us-ascii');
176     }
177     },
178 wakaba 1.1 decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'euc'); $s },
179     mime_text => 1,
180     );
181     Message::MIME::Charset::make_charset (shift_jis =>
182 wakaba 1.2 encoder => sub {
183     my $s = Jcode->new ($_[1], $CODE{internal})->sjis;
184     if ($s =~ /[\x80-\xFF]/) {
185     ($s, charset => 'shift_jis');
186     } elsif ($s =~ /[\x5C\x7E]/) {
187     ($s, charset => 'jis_x0201');
188     } else {
189     ($s, charset => 'us-ascii');
190     }
191     },
192 wakaba 1.1 decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'sjis'); $s },
193     mime_text => 1,
194     );
195     Message::MIME::Charset::make_charset ('utf-8' =>
196     encoder => sub { Jcode->new ($_[1], $CODE{internal})->utf8 },
197     decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'utf8'); $s },
198     mime_text => 1,
199     );
200     Message::MIME::Charset::make_charset ('ucs-2be' =>
201     encoder => sub { Jcode->new ($_[1], $CODE{internal})->ucs2 },
202     decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'ucs2'); $s },
203     );
204     Message::MIME::Charset::make_charset ('ucs-2' => alias_of => 'ucs-2be');
205     Message::MIME::Charset::make_charset ('utf-16' => alias_of => 'ucs-2');
206     Message::MIME::Charset::make_charset ('utf-16be' => alias_of => 'ucs-2be');
207     } else {
208     Carp::croak "Jcode: $_: Module not supported";
209     }
210     Message::MIME::Charset::make_charset (jis => alias_of => 'iso-2022-jp');
211 wakaba 1.2 Message::MIME::Charset::make_charset (junet => alias_of => 'iso-2022-jp');
212 wakaba 1.1 Message::MIME::Charset::make_charset ('iso-2022-jp-1' => alias_of => 'iso-2022-jp');
213     Message::MIME::Charset::make_charset ('iso-2022-jp-3' => alias_of => 'iso-2022-jp');
214     Message::MIME::Charset::make_charset ('x-iso-2022-jp-3' => alias_of => 'iso-2022-jp-3');
215     Message::MIME::Charset::make_charset ('iso-2022-jp-3-plane1' => alias_of => 'iso-2022-jp-3');
216     Message::MIME::Charset::make_charset (euc => alias_of => 'euc-jp');
217     Message::MIME::Charset::make_charset (euc_jp => alias_of => 'euc-jp');
218     Message::MIME::Charset::make_charset ('x-euc' => alias_of => 'euc-jp');
219     Message::MIME::Charset::make_charset ('x-euc-jp' => alias_of => 'euc-jp');
220     Message::MIME::Charset::make_charset ('euc-jisx0213' => alias_of => 'euc-jp');
221     Message::MIME::Charset::make_charset ('x-euc-jisx0213' => alias_of => 'euc-jisx0213');
222     Message::MIME::Charset::make_charset ('euc-jisx0213-plane1' => alias_of => 'euc-jisx0213');
223     Message::MIME::Charset::make_charset (sjis => alias_of => 'shift_jis');
224     Message::MIME::Charset::make_charset ('shift-jis' => alias_of => 'shift_jis');
225     Message::MIME::Charset::make_charset ('x-sjis' => alias_of => 'shift_jis');
226     Message::MIME::Charset::make_charset (shift_jisx0213 => alias_of => 'shift_jis');
227     Message::MIME::Charset::make_charset ('shift-jisx0213' => alias_of => 'shift_jisx0213');
228     Message::MIME::Charset::make_charset ('x-shift_jisx0213' => alias_of => 'shift_jisx0213');
229     Message::MIME::Charset::make_charset ('x-shift-jisx0213' => alias_of => 'shift_jisx0213');
230     Message::MIME::Charset::make_charset ('shift_jisx0213-plane1' => alias_of => 'shift_jisx0213');
231 wakaba 1.2 Message::MIME::Charset::make_charset (jis_x0201 => alias_of => 'shift_jis');
232     Message::MIME::Charset::make_charset (x0201 => alias_of => 'jis_x0201');
233 wakaba 1.1 }
234     }
235    
236     =head1 EXAMPLE
237    
238     ## Uses jcode.pl. Input is euc-japan, output is junet.
239     use Message::MIME::Charset::Jcode 'jcode.pl';
240     ## You don't have to do {require 'jcode.pl'}.
241     $Message::MIME::Charset::Jcode::CODE{input} = 'euc';
242     $Message::MIME::Charset::Jcode::CODE{output} = 'jis';
243     require Message::Entity;
244     #...
245    
246     ## Uses Jcode.pm.
247     use Message::MIME::Charset::Jcode 'Jcode';
248     require Message::Entity;
249     #...
250    
251     ## Uses jcode.pl, but also Jcode.pm for Unicode encodings.
252     ## Internal code is UTF-8.
253     use Message::MIME::Charset::Jcode 'Jcode';
254     use Message::MIME::Charset::Jcode 'jcode.pl';
255     $Message::MIME::Charset::Jcode::CODE{internal} = 'utf-8';
256     require Message::Entity;
257     #...
258    
259     =head1 SEE ALSO
260    
261     Message::MIME::Charset
262    
263     Message::Entity
264    
265     jcode.pl
266    
267     Jcode.pm
268    
269     =head1 LICENSE
270    
271     Copyright 2002 wakaba E<lt>[email protected]<gt>.
272    
273     This program is free software; you can redistribute it and/or modify
274     it under the terms of the GNU General Public License as published by
275     the Free Software Foundation; either version 2 of the License, or
276     (at your option) any later version.
277    
278     This program is distributed in the hope that it will be useful,
279     but WITHOUT ANY WARRANTY; without even the implied warranty of
280     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
281     GNU General Public License for more details.
282    
283     You should have received a copy of the GNU General Public License
284     along with this program; see the file COPYING. If not, write to
285     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
286     Boston, MA 02111-1307, USA.
287    
288     =head1 CHANGE
289    
290     See F<ChangeLog>.
291 wakaba 1.2 $Date: 2002/05/30 12:48:04 $
292 wakaba 1.1
293     =cut
294    
295     1;

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24