/[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.5 - (hide annotations) (download)
Sun Jun 9 11:09:38 2002 UTC (24 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.4: +43 -20 lines
2002-06-09  wakaba <w@suika.fam.cx>

	* Jcode.pm: Support 'name_minimumizer'.

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 wakaba 1.3 supported by jcode.pl, Jcode.pm and/or other modules.
13    
14     =head1 USAGE
15    
16     use Message::MIME::Charset::Jcode $module_name;
17    
18     where $module_name is name of module. List of it is shown below:
19    
20     =over 4
21    
22     =item 'jcode.pl'
23    
24     jcode.pl L<lt>http://srekcah.org/jcode/>
25    
26     =item 'Jcode' or 'Jcode.pm'
27    
28     Jcode.pm L<lt>http://openlab.ring.gr.jp/Jcode/index-j.html>
29    
30     =item 'NKF' or 'NKF.pm'
31    
32     Network Kanji Filter (Perl module version)
33     L<lt>http://bw-www.ie.u-ryukyu.ac.jp/~kono/software.html>
34    
35     =item 'Unicode::Japanese' or 'Unicode::Japanese.pm'
36    
37     Unicode::Japanese L<lt>http://tech.ymirlink.co.jp/>
38    
39     =back
40    
41     When this module is C<use>d multiple times with different
42     conversion module name, latest one is used. For example,
43    
44     use Message::MIME::Charset::Jcode 'jcode.pl';
45     use Message::MIME::Charset::Jcode 'Jcode';
46    
47     results to instruct to use Jcode.pm.
48    
49     use Message::MIME::Charset::Jcode 'Jcode';
50     use Message::MIME::Charset::Jcode 'jcode.pl';
51    
52     This example code leads a bit different result. Jcode.pm can
53     treat UTF-8, but jcode.pl cann't. So convertion from/to UTF-8
54     is done by Jcode.pm. But between other coding systems such as EUC-JP
55     E<lt>-E<gt> Shift JIS, jcode.pl is used.
56    
57     Note that this module does not support Encode modules available
58     with Perl 5.7 or later. It will be supported by
59     Message::MIME::Charset::Encode.
60 wakaba 1.1
61     =cut
62    
63     package Message::MIME::Charset::Jcode;
64     use strict;
65     use vars qw(%CODE $VERSION);
66 wakaba 1.5 $VERSION=do{my @r=(q$Revision: 1.4 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
67 wakaba 1.1
68     require Message::Util;
69     require Message::MIME::Charset;
70    
71 wakaba 1.3 =head1 CODING SYSTEMS NAMES
72    
73     These names can be used as the value of L</VARIABLES>.
74     (These name are NOT same as MIME charset name, which is acutually
75     written down in message header fields.)
76 wakaba 1.1
77     =over 4
78    
79     =item C<euc>
80    
81     Japanese EUC. (MIME: euc-jp)
82    
83     =item C<jis>
84    
85     7bit ISO/IEC 2022, so-called junet code. ASCII, JIS X 0201 Roman,
86     JIS X 0201 Katakana, JIS X 0208, JIS X 0212 are supported by
87     jcode.pl and Jcode.pm. ISO-2022-JP, ISO-2022-JP-1 are subsets of
88     junet code.
89    
90     =item C<sjis>
91    
92     Shift JIS. (MIME: Shift_JIS)
93    
94     =item C<utf8>
95    
96 wakaba 1.3 UTF-8. (MIME: UTF-8) This coding system is not supported by jcode.pl
97     and NKF.pm.
98 wakaba 1.1
99     =item C<ucs2>
100    
101     UCS-2 (or Unicode without surrogate pairs) big endian (network
102 wakaba 1.3 byte order). This coding system is not supported by jcode.pl
103     and NKF.pm.
104 wakaba 1.1
105     =back
106    
107     =head1 VARIABLES
108    
109     =over 4
110    
111     =item $Messag::MIME::Charset::Jcode::CODE{internal}
112    
113     Internal coding system. You can get strings written in this
114     coding system from Message::* Perl modules. (Default: C<euc>)
115    
116     =item $Messag::MIME::Charset::Jcode::CODE{input}
117    
118     Coding system of input string. (Default: auto-detect)
119    
120     =item $Messag::MIME::Charset::Jcode::CODE{output}
121    
122     Coding system of output string. (Default: C<jis>)
123    
124     =back
125    
126     =cut
127    
128 wakaba 1.3 $CODE{internal} = 'euc'; ## default: 'euc' / 'utf8' (Unicode::Japanese)
129     $CODE{input} = ''; ## default: auto-detect
130     $CODE{output} = 'jis'; ## default: 'jis'
131 wakaba 1.1
132     sub import ($;%) {
133     shift;
134     for (@_) {
135     if ($_ eq 'jcode.pl') {
136     require 'jcode.pl';
137     Message::MIME::Charset::make_charset ('*default' =>
138     encoder => sub { jcode::to ($CODE{output}, $_[1], $CODE{internal}) },
139     decoder => sub { jcode::to ($CODE{internal}, $_[1], $CODE{input}) },
140     mime_text => 1,
141     );
142     Message::MIME::Charset::make_charset ('iso-2022-jp' =>
143 wakaba 1.2 encoder => sub {
144     my $s = jcode::jis ($_[1], $CODE{internal});
145 wakaba 1.5 ($s, iso_2022_mime_charset_name ('iso-2022-jp', $s));
146 wakaba 1.2 },
147 wakaba 1.1 decoder => sub { jcode::to ($CODE{internal}, $_[1], 'jis') },
148 wakaba 1.5 name_minimumizer => \&iso_2022_mime_charset_name,
149 wakaba 1.1 mime_text => 1,
150     cte_7bit_preferred => 'base64',
151     );
152     Message::MIME::Charset::make_charset ('euc-jp' =>
153 wakaba 1.2 encoder => sub {
154     my $s = jcode::euc ($_[1], $CODE{internal});
155 wakaba 1.5 ($s, euc_japan_mime_charset_name ('euc-jp' => $s));
156 wakaba 1.2 },
157 wakaba 1.1 decoder => sub { jcode::to ($CODE{internal}, $_[1], 'euc') },
158 wakaba 1.5 name_minimumizer => \&euc_japan_mime_charset_name,
159 wakaba 1.1 mime_text => 1,
160     );
161     Message::MIME::Charset::make_charset (shift_jis =>
162 wakaba 1.2 encoder => sub {
163     my $s = jcode::sjis ($_[1], $CODE{internal});
164 wakaba 1.5 ($s, shift_jis_mime_charset_name (shift_jis => $s));
165 wakaba 1.2 },
166 wakaba 1.1 decoder => sub { jcode::to ($CODE{internal}, $_[1], 'sjis') },
167 wakaba 1.5 name_minimumizer => \&shift_jis_mime_charset_name,
168 wakaba 1.1 mime_text => 1,
169     );
170     } elsif ($_ eq 'Jcode' || $_ eq 'Jcode.pm') {
171     require Jcode;
172     Message::MIME::Charset::make_charset ('*default' =>
173     encoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{output}, $CODE{internal}); $s },
174     decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, $CODE{input}); $s },
175     mime_text => 1,
176     );
177     Message::MIME::Charset::make_charset ('iso-2022-jp' =>
178 wakaba 1.2 encoder => sub {
179 wakaba 1.3 my $s = Jcode->new ($_[1], $CODE{internal})->jis; ## ->iso_2022_jp;
180 wakaba 1.5 ($s, iso_2022_mime_charset_name ('iso-2022-jp' => $s));
181 wakaba 1.2 },
182 wakaba 1.1 decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'jis'); $s },
183 wakaba 1.5 name_minimumizer => \&iso_2022_mime_charset_name,
184 wakaba 1.1 mime_text => 1,
185     cte_7bit_preferred => 'base64',
186     );
187     Message::MIME::Charset::make_charset ('euc-jp' =>
188 wakaba 1.2 encoder => sub {
189     my $s = Jcode->new ($_[1], $CODE{internal})->euc;
190 wakaba 1.5 ($s, euc_japan_mime_charset_name ('euc-jp' => $s));
191 wakaba 1.2 },
192 wakaba 1.1 decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'euc'); $s },
193 wakaba 1.5 name_minimumizer => \&euc_japan_mime_charset_name,
194 wakaba 1.1 mime_text => 1,
195     );
196     Message::MIME::Charset::make_charset (shift_jis =>
197 wakaba 1.2 encoder => sub {
198     my $s = Jcode->new ($_[1], $CODE{internal})->sjis;
199 wakaba 1.5 ($s, shift_jis_mime_charset_name (shift_jis => $s));
200 wakaba 1.2 },
201 wakaba 1.1 decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'sjis'); $s },
202 wakaba 1.5 name_minimumizer => \&shift_jis_mime_charset_name,
203 wakaba 1.1 mime_text => 1,
204     );
205     Message::MIME::Charset::make_charset ('utf-8' =>
206     encoder => sub { Jcode->new ($_[1], $CODE{internal})->utf8 },
207     decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'utf8'); $s },
208     mime_text => 1,
209     );
210     Message::MIME::Charset::make_charset ('ucs-2be' =>
211     encoder => sub { Jcode->new ($_[1], $CODE{internal})->ucs2 },
212     decoder => sub { my $s = $_[1]; Jcode::convert (\$s, $CODE{internal}, 'ucs2'); $s },
213     );
214     Message::MIME::Charset::make_charset ('ucs-2' => alias_of => 'ucs-2be');
215     Message::MIME::Charset::make_charset ('utf-16' => alias_of => 'ucs-2');
216     Message::MIME::Charset::make_charset ('utf-16be' => alias_of => 'ucs-2be');
217 wakaba 1.3 } elsif ($_ eq 'NKF' || $_ eq 'NKF.pm') {
218     unless ($NKF::VERSION) {
219     eval { use NKF } or Carp::croak ("Message::MIME::Charset::Jcode: NKF: $@");
220     }
221     Message::MIME::Charset::make_charset ('*default' =>
222     encoder => sub { nkf ( "-". substr ($CODE{output}, 0, 1)
223     . " -".uc (substr ($CODE{internal}, 0, 1)), $_[1] ) },
224     decoder => sub { nkf ( "-". substr ($CODE{internal}, 0, 1)
225     . " -".uc (substr ($CODE{input}, 0, 1)), $_[1] ) },
226     mime_text => 1,
227     );
228     Message::MIME::Charset::make_charset ('iso-2022-jp' =>
229     encoder => sub {
230     my $s = nkf ( "-j -".uc (substr ($CODE{internal}, 0, 1)), $_[1] );
231 wakaba 1.5 ($s, iso_2022_mime_charset_name ('iso-2022-jp' => $s));
232 wakaba 1.3 },
233     decoder => sub { nkf ( "-". substr ($CODE{internal}, 0, 1) . " -J", $_[1] ) },
234 wakaba 1.5 name_minimumizer => \&iso_2022_mime_charset_name,
235 wakaba 1.3 mime_text => 1,
236     cte_7bit_preferred => 'base64',
237     );
238     Message::MIME::Charset::make_charset ('euc-jp' =>
239     encoder => sub {
240     my $s = nkf ( "-e -".uc (substr ($CODE{internal}, 0, 1)), $_[1] );
241 wakaba 1.5 ($s, euc_japan_mime_charset_name ('euc-jp' => $s));
242 wakaba 1.3 },
243     decoder => sub { nkf ( "-". substr ($CODE{internal}, 0, 1) . " -E", $_[1] ) },
244 wakaba 1.5 name_minimumizer => \&euc_japan_mime_charset_name,
245 wakaba 1.3 mime_text => 1,
246     );
247     Message::MIME::Charset::make_charset (shift_jis =>
248     encoder => sub {
249     my $s = nkf ( "-s -".uc (substr ($CODE{internal}, 0, 1)), $_[1] );
250 wakaba 1.5 ($s, shift_jis_mime_charset_name (shift_jis => $s));
251 wakaba 1.3 },
252     decoder => sub { nkf ( "-". substr ($CODE{internal}, 0, 1) . " -S", $_[1] ) },
253 wakaba 1.5 name_minimumizer => \&shift_jis_mime_charset_name,
254 wakaba 1.3 mime_text => 1,
255     );
256     } elsif ($_ eq 'Unicode::Japanese' || $_ eq 'Unicode::Japanese.pm') {
257     require Unicode::Japanese;
258     $CODE{internal} = 'utf8';
259     Message::MIME::Charset::make_charset ('*default' =>
260     ## Very tricky:-)
261     encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->conv ($CODE{output}) },
262     decoder => sub { Unicode::Japanese->new ($_[1], $CODE{input} || 'auto')->conv ($CODE{internal}) },
263     mime_text => 1,
264     );
265     Message::MIME::Charset::make_charset ('iso-2022-jp' =>
266     encoder => sub {
267     my $s = Unicode::Japanese->new ($_[1], $CODE{internal})->jis;
268 wakaba 1.5 ($s, iso_2022_mime_charset_name ('iso-2022-jp' => $s));
269 wakaba 1.3 },
270     decoder => sub { Unicode::Japanese->new ($_[1], 'jis')->conv ($CODE{internal}) },
271 wakaba 1.5 name_minimumizer => \&iso_2022_mime_charset_name,
272 wakaba 1.3 mime_text => 1,
273     cte_7bit_preferred => 'base64',
274     );
275     Message::MIME::Charset::make_charset ('euc-jp' =>
276     encoder => sub {
277     my $s = Unicode::Japanese->new ($_[1], $CODE{internal})->euc;
278 wakaba 1.5 ($s, euc_japan_mime_charset_name ('euc-jp' => $s));
279 wakaba 1.3 },
280     decoder => sub { Unicode::Japanese->new ($_[1], 'euc')->conv ($CODE{internal}) },
281 wakaba 1.5 name_minimumizer => \&euc_japan_mime_charset_name,
282 wakaba 1.3 mime_text => 1,
283     );
284     Message::MIME::Charset::make_charset (shift_jis =>
285     encoder => sub {
286     my $s = Unicode::Japanese->new ($_[1], $CODE{internal})->sjis;
287 wakaba 1.5 ($s, shift_jis_mime_charset_name (shift_jis => $s));
288 wakaba 1.3 },
289     decoder => sub { Unicode::Japanese->new ($_[1], 'sjis')->conv ($CODE{internal}) },
290 wakaba 1.5 name_minimumizer => \&shift_jis_mime_charset_name,
291 wakaba 1.3 mime_text => 1,
292     );
293     Message::MIME::Charset::make_charset ('utf-8' =>
294     encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->utf8 },
295     decoder => sub { Unicode::Japanese->new ($_[1], 'utf8')->conv ($CODE{internal}) },
296     mime_text => 1,
297     );
298     Message::MIME::Charset::make_charset ('ucs-2' =>
299     encoder => sub { "\xFF\xFE".Unicode::Japanese->new ($_[1], $CODE{internal})->ucs2 },
300     decoder => sub { Unicode::Japanese->new ($_[1], 'ucs2')->conv ($CODE{internal}) },
301     );
302     Message::MIME::Charset::make_charset ('ucs-2be' =>
303     encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->ucs2 },
304     decoder => sub { Unicode::Japanese->new ($_[1], 'ucs2')->conv ($CODE{internal}) },
305     );
306     Message::MIME::Charset::make_charset ('utf-16' =>
307     encoder => sub { "\xFF\xFE".Unicode::Japanese->new ($_[1], $CODE{internal})->utf16 },
308     decoder => sub { Unicode::Japanese->new ($_[1], 'utf16')->conv ($CODE{internal}) },
309     );
310     Message::MIME::Charset::make_charset ('utf-16be' =>
311     encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->utf16 },
312     decoder => sub { Unicode::Japanese->new ($_[1], 'utf16-ge')->conv ($CODE{internal}) },
313     );
314     Message::MIME::Charset::make_charset ('utf-16le' =>
315     #encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->utf16 },
316     decoder => sub { Unicode::Japanese->new ($_[1], 'utf16-le')->conv ($CODE{internal}) },
317     );
318     Message::MIME::Charset::make_charset ('ucs-2le' => alias_of => 'utf-16le');
319     Message::MIME::Charset::make_charset ('utf-32' =>
320     encoder => sub { "\x00\x00\xFF\xFE".Unicode::Japanese->new ($_[1], $CODE{internal})->ucs4 },
321     decoder => sub { Unicode::Japanese->new ($_[1], 'utf32')->conv ($CODE{internal}) },
322     );
323     Message::MIME::Charset::make_charset ('ucs-4' =>
324     encoder => sub { "\x00\x00\xFF\xFE".Unicode::Japanese->new ($_[1], $CODE{internal})->ucs4 },
325     decoder => sub { Unicode::Japanese->new ($_[1], 'ucs4')->conv ($CODE{internal}) },
326     );
327     Message::MIME::Charset::make_charset ('utf-32be' =>
328     encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->ucs4 },
329     decoder => sub { Unicode::Japanese->new ($_[1], 'utf32-ge')->conv ($CODE{internal}) },
330     );
331     Message::MIME::Charset::make_charset ('ucs-4be' =>
332     encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->ucs4 },
333     decoder => sub { Unicode::Japanese->new ($_[1], 'ucs4')->conv ($CODE{internal}) },
334     );
335     Message::MIME::Charset::make_charset ('utf-32le' =>
336     #encoder => sub { Unicode::Japanese->new ($_[1], $CODE{internal})->utf32 },
337     decoder => sub { Unicode::Japanese->new ($_[1], 'utf32-le')->conv ($CODE{internal}) },
338     );
339     Message::MIME::Charset::make_charset ('ucs-4le' => alias_of => 'utf-32le');
340 wakaba 1.1 } else {
341     Carp::croak "Jcode: $_: Module not supported";
342     }
343 wakaba 1.3 ## Defines common alias names
344 wakaba 1.1 Message::MIME::Charset::make_charset (jis => alias_of => 'iso-2022-jp');
345 wakaba 1.2 Message::MIME::Charset::make_charset (junet => alias_of => 'iso-2022-jp');
346 wakaba 1.4 Message::MIME::Charset::make_charset ('junet-code' => alias_of => 'iso-2022-jp');
347 wakaba 1.1 Message::MIME::Charset::make_charset ('iso-2022-jp-1' => alias_of => 'iso-2022-jp');
348     Message::MIME::Charset::make_charset ('iso-2022-jp-3' => alias_of => 'iso-2022-jp');
349     Message::MIME::Charset::make_charset ('x-iso-2022-jp-3' => alias_of => 'iso-2022-jp-3');
350     Message::MIME::Charset::make_charset ('iso-2022-jp-3-plane1' => alias_of => 'iso-2022-jp-3');
351     Message::MIME::Charset::make_charset (euc => alias_of => 'euc-jp');
352     Message::MIME::Charset::make_charset (euc_jp => alias_of => 'euc-jp');
353     Message::MIME::Charset::make_charset ('x-euc' => alias_of => 'euc-jp');
354     Message::MIME::Charset::make_charset ('x-euc-jp' => alias_of => 'euc-jp');
355     Message::MIME::Charset::make_charset ('euc-jisx0213' => alias_of => 'euc-jp');
356     Message::MIME::Charset::make_charset ('x-euc-jisx0213' => alias_of => 'euc-jisx0213');
357     Message::MIME::Charset::make_charset ('euc-jisx0213-plane1' => alias_of => 'euc-jisx0213');
358 wakaba 1.4 Message::MIME::Charset::make_charset ('x-euc-jisx0213-packed' => alias_of => 'euc-jisx0213');
359 wakaba 1.1 Message::MIME::Charset::make_charset (sjis => alias_of => 'shift_jis');
360     Message::MIME::Charset::make_charset ('shift-jis' => alias_of => 'shift_jis');
361     Message::MIME::Charset::make_charset ('x-sjis' => alias_of => 'shift_jis');
362     Message::MIME::Charset::make_charset (shift_jisx0213 => alias_of => 'shift_jis');
363     Message::MIME::Charset::make_charset ('shift-jisx0213' => alias_of => 'shift_jisx0213');
364     Message::MIME::Charset::make_charset ('x-shift_jisx0213' => alias_of => 'shift_jisx0213');
365     Message::MIME::Charset::make_charset ('x-shift-jisx0213' => alias_of => 'shift_jisx0213');
366     Message::MIME::Charset::make_charset ('shift_jisx0213-plane1' => alias_of => 'shift_jisx0213');
367 wakaba 1.2 Message::MIME::Charset::make_charset (jis_x0201 => alias_of => 'shift_jis');
368     Message::MIME::Charset::make_charset (x0201 => alias_of => 'jis_x0201');
369 wakaba 1.1 }
370     }
371    
372 wakaba 1.5 sub unimport ($) {
373     for (qw/euc euc-jisx0213 euc-jisx0213-plane1 euc-jp euc_jp iso-2022-jp iso-2022-jp-1 iso-2022-jp-3 iso-2022-jp-3-plane1 jis jis_x0201 junet junet-code shift-jis shift_jis shift-jisx0213 shift_jisx0213 shift_jisx0213-plane1 sjis ucs-2 ucs-2be ucs-2le ucs-4 ucs-4be ucs-4le utf-8 utf-16 utf-16be utf-16le utf-32 utf-32be utf-32le x0201 x-euc x-euc-jisx0213 x-euc-jisx0213-plane1 x-euc-jp x-iso-2022-jp-3 x-shift-jisx0213 x-shift_jisx0213 s-sjis/) {
374     delete $Message::MIME::Charset::CHARSET{$_};
375     }
376     Message::MIME::Charset::make_charset ('*default' =>
377     encoder => sub { $_[1] },
378     decoder => sub { $_[1] },
379     mime_text => 1,
380     );
381     }
382    
383 wakaba 1.3 ## Returns MIME charset of 7bit ISO 2022 (*junet* family)
384 wakaba 1.5 sub iso_2022_mime_charset_name ($$) {
385     shift; my $s = shift;
386 wakaba 1.3 if ($s =~ /\x1B\x28[^BJ]|\x1B\x24\x28[^D]|\x1B\x24[^\x28\x40B]/) {
387     if ($s =~ /\x1B\x28[^B]|\x1B\x24[^\x28]|\x1B\x24\x28[^OP]/) {
388     (charset => 'junet');
389     } elsif ($s =~ /\x1B\x24\x28P/) {
390     (charset => 'iso-2022-jp-3');
391     } else {
392     (charset => 'iso-2022-jp-3-plane1');
393     }
394     } elsif ($s =~ /\x1B\x24\x28D/) {
395     (charset => 'iso-2022-jp-1');
396     } elsif ($s =~ /\x1B\x28[BJ]|\x1B\x24[\x40B]/) {
397     (charset => 'iso-2022-jp');
398     } else {
399     (charset => 'us-ascii');
400     }
401 wakaba 1.4 }
402    
403     ## Returns MIME charset of 8bit ISO 2022 (EUC-Japan)
404 wakaba 1.5 sub euc_japan_mime_charset_name ($$) {
405     shift; my $s = shift;
406 wakaba 1.4 if ($s =~ /[\x80-\xFF]/) {
407     if ($s =~ /\x8F[\xA1\xA3-\xA5\xA8\xAC-\xAF\xEE-\xFE][\xA1-\xFE]/) {
408     if ($s =~ /\x8F[\xA2\xA6\xA7\xA9-\xAB\xB0-\xED][\xA1-\xFE]/) {
409     ## JIS X 0213 plane 2 + JIS X 0212
410     (charset => 'x-euc-jisx0213-packed');
411     } else {
412     (charset => 'euc-jisx0213');
413     }
414     } elsif ($s =~ /(?<!\x8F) ## Not G3 character
415     (?: ## JIS X 0213:2000
416     [\xA9-\xAF\xF5-\xFE][\xA1-\xFE]
417     |\xA2[\xAF-\xB9\xC2-\xC9\xD1-\xDB\xE9-\xF1\xFA-\xFD]
418     |\xA3[\xA1-\xAF\xBA-\xC0\xDB-\xE0\xFB-\xFE]
419     |\xA4[\xF4-\xFE]|\xA5[\xF7-\xFE]
420     |\xA6[\xB9-\xC0\xD9-\xFE]|\xA7[\xC2-\xD0\xF2-\xFE]
421     |\xA8[\xC1-\xFE]|\xCF[\xD4-\xFE]|\xF4[\xA7-\xFE]
422     )
423     (?=(?:[\xA1-\xFE][\xA1-\xFE])*(?:[\x00-\xA0FF]|\z))/x) {
424     if ($s =~ /\x8F/) { ## JIS X 0213 plane 1 + JIS X 0212
425     (charset => 'x-euc-jisx0213-packed');
426     } else {
427     (charset => 'euc-jisx0213-plane1');
428     }
429     } else {
430     (charset => 'euc-jp');
431     }
432     } else {
433     (charset => 'us-ascii');
434     }
435     }
436    
437     ## Returns MIME charset of 8bit ISO 2022 (EUC-Japan)
438 wakaba 1.5 sub shift_jis_mime_charset_name ($$) {
439     shift; my $s = shift;
440 wakaba 1.4 if ($s =~ /[\x80-\xFF]/) {
441     if ($s =~ /
442     (?:\G|[\x00-\x3F\x7F])
443     (?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]
444     |[\x40-\x7E\xA1-\xDF])*
445     [\xF0-\xFC][\x40-\x7E\x80-\xFC]
446     /x) {
447     (charset => 'shift_jisx0213');
448     } elsif ($s =~ /
449     (?:\G|[\x00-\x3F\x7F])
450     (?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]
451     |[\x40-\x7E\xA1-\xDF])*
452     (?:
453     [\x85-\x87\xEB-\xEF][\x40-\x7E\x80-\xFC]
454     |\x81[\xAD-\xB7\xC0-\xC7\xCF-\xD9\xE9-\xEF\xF8-\xFB]
455     |\x82[\x40-\x4E\x59-\x5F\x7A-\x80\x9B-\x9E\xF2-\xFC]
456     |\x83[\x97-\x9E\xB7-\xBE\xD7-\xFC]
457     |\x84[\x61-\x6F\x72-\x9E\xBF-\xFC]
458     |\x88[\x40-\x9E]|\x98[\x73-\x9E]|\xEA[\xA5-\xFC]
459     )
460     /x) {
461     (charset => 'shift_jisx0213-plane1');
462     } else {
463     (charset => 'shift_jis');
464     }
465     } elsif ($s =~ /[\x5C\x7E]/) {
466     (charset => 'jis_x0201');
467     } else {
468     (charset => 'us-ascii');
469     }
470 wakaba 1.3 }
471    
472 wakaba 1.1 =head1 EXAMPLE
473    
474     ## Uses jcode.pl. Input is euc-japan, output is junet.
475     use Message::MIME::Charset::Jcode 'jcode.pl';
476     ## You don't have to do {require 'jcode.pl'}.
477     $Message::MIME::Charset::Jcode::CODE{input} = 'euc';
478     $Message::MIME::Charset::Jcode::CODE{output} = 'jis';
479     require Message::Entity;
480     #...
481    
482     ## Uses Jcode.pm.
483     use Message::MIME::Charset::Jcode 'Jcode';
484     require Message::Entity;
485     #...
486    
487     ## Uses jcode.pl, but also Jcode.pm for Unicode encodings.
488     ## Internal code is UTF-8.
489     use Message::MIME::Charset::Jcode 'Jcode';
490     use Message::MIME::Charset::Jcode 'jcode.pl';
491     $Message::MIME::Charset::Jcode::CODE{internal} = 'utf-8';
492     require Message::Entity;
493     #...
494    
495     =head1 SEE ALSO
496    
497     Message::MIME::Charset
498    
499     Message::Entity
500    
501     jcode.pl
502    
503     Jcode.pm
504    
505     =head1 LICENSE
506    
507     Copyright 2002 wakaba E<lt>[email protected]<gt>.
508    
509     This program is free software; you can redistribute it and/or modify
510     it under the terms of the GNU General Public License as published by
511     the Free Software Foundation; either version 2 of the License, or
512     (at your option) any later version.
513    
514     This program is distributed in the hope that it will be useful,
515     but WITHOUT ANY WARRANTY; without even the implied warranty of
516     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
517     GNU General Public License for more details.
518    
519     You should have received a copy of the GNU General Public License
520     along with this program; see the file COPYING. If not, write to
521     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
522     Boston, MA 02111-1307, USA.
523    
524     =head1 CHANGE
525    
526     See F<ChangeLog>.
527 wakaba 1.5 $Date: 2002/06/06 11:24:10 $
528 wakaba 1.1
529     =cut
530    
531     1;

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24