Changeset 1434

Show
Ignore:
Timestamp:
11/14/07 09:23:51 (6 years ago)
Author:
tokuhirom
Message:

lang/perl/Encode-JP-Mobile: added encode support at KDDIJIS.

Location:
lang/perl/Encode-JP-Mobile/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Encode-JP-Mobile/trunk/lib/Encode/JP/Mobile/KDDIJIS.pm

    r1392 r1434  
    1313__PACKAGE__->Define(qw(x-iso-2022-jp-kddi)); 
    1414 
    15 # JIS<->EUC 
    1615my $re_scan_jis = qr{ 
    1716   (?:($RE{JIS_0212})|$RE{JIS_0208}|($RE{ISO_ASC})|($RE{JIS_KANA}))([^\e]*) 
     
    3231 
    3332sub encode($$;$) { 
    34     my($self, $str, $check) = @_; 
    35     croak "ENCODE IS NOT SUPPORTED YET"; 
     33    my ( $obj, $utf8, $chk ) = @_; 
     34    my $octet = Encode::encode( 'x-sjis-kddi', $utf8, $chk ); 
     35    return sjis_jis( $octet ); 
     36} 
     37 
     38sub ASC () { 1 } 
     39sub JIS_0208 () { 2 } 
     40sub KANA () { 3 } 
     41sub sjis_jis { 
     42    my $octet = shift; 
     43 
     44    use bytes; 
     45 
     46    my @chars = split //, $octet; 
     47    my $mode = ASC; 
     48    my $res = ''; 
     49 
     50    for (my $i=0; $i<@chars; $i++) { 
     51        my $x = ord $chars[$i]; 
     52        if ($x < 0x80) { 
     53            if ($mode != ASC) { 
     54                $res .= $ESC{ASC}; 
     55                $mode = ASC; 
     56            } 
     57            $res .= chr $x; 
     58        } elsif (0xA1 <= $x && $x <= 0xDF) { 
     59            if ($mode != KANA) { 
     60                $res .= $ESC{KANA}; 
     61                $mode = KANA; 
     62            } 
     63            $mode = KANA; 
     64            $res .= chr($x - 0x80); 
     65        } else { 
     66            if ($mode != JIS_0208) { 
     67                $res .= $ESC{JIS_0208}; 
     68                $mode = JIS_0208; 
     69            } 
     70            $i++; 
     71            last unless $i<@chars; 
     72            my ($c1, $c2) = sjis2jis_one($x, ord $chars[$i]); 
     73            $res .= chr($c1).chr($c2); 
     74        } 
     75    } 
     76 
     77    if ($mode != ASC) { 
     78        $res .= $ESC{ASC}; 
     79    } 
     80 
     81    $res; 
     82} 
     83sub sjis2jis_one { 
     84    my ($c1, $c2) = @_; 
     85 
     86    # 0x0600 : 0xF340 - 0xF48D 
     87    # 0x0B00 : 0xF640 - 0xF7FC 
     88 
     89    my $c = ($c1<<8) + $c2; 
     90    if (0xF340 <= $c && $c <= 0xF48D) { 
     91        $c1 -= 0x06; 
     92    } elsif (0xF640 <= $c && $c <= 0xF7FC) { 
     93        $c1 -= 0x0B; 
     94    } 
     95 
     96    $c1 -= ($c1 <= 0x9f) ? 0x71 : 0xB1; 
     97    $c1 = $c1*2 + 1; 
     98 
     99    if ($c2 > 0x7F) { 
     100        $c2 -= 0x01; 
     101    } 
     102 
     103    if ($c2>=0x9E) { 
     104        $c2  = $c2-0x7D; 
     105        $c1++; 
     106    } else { 
     107        $c2 -= 0x1F; 
     108    } 
     109 
     110    return ($c1, $c2); 
    36111} 
    37112 
     
    128203この後で、x-sjis-kddi で decode すれば OK. 
    129204 
     205encode の場合はこの逆をやればよい。unicode 文字列を sjis のバイト列に encode してやり、 
     206下記のエリアにある文字列をシフトしてやる。 
     207 
     208 * 0x0600 : 0xF340 - 0xF48D 
     209 * 0x0B00 : 0xF640 - 0xF7FC 
     210 
     211こうしてシフトしつつ、iso-2022-jp に変換してやればよい。 
     212 
    130213=head1 TODO 
    131214 
  • lang/perl/Encode-JP-Mobile/trunk/t/kddi-jis.t

    r1392 r1434  
    11use strict; 
    22use warnings; 
    3 use Test::More tests => 5; 
     3use Test::More tests => 17; 
    44use Encode::JP::Mobile; 
    55use Encode::JP::Mobile::KDDIJIS; 
    66use Encode; 
    7 use Data::Dumper; 
    87 
    9 is decode("x-iso-2022-jp-kddi", "\e\$B\x75\x41\e(B"), "\x{E488}"; 
    10 is decode("x-iso-2022-jp-kddi", "\e\$B\x75\x41\x76\x76\e(B"), "\x{e488}\x{e51b}"; 
    11 is decode('x-iso-2022-jp-kddi', encode('iso-2022-jp', decode("utf8", "お"))), decode('utf8', "お"), 'o'; 
    12 is decode('x-iso-2022-jp-kddi', encode('iso-2022-jp', decode("utf8", "おいおい。山岡くん。kanbenしてくれよ!"))), decode('utf8', "おいおい。山岡くん。kanbenしてくれよ!"), 'kanji, hiragana, alphabet'; 
    13 is decode('x-iso-2022-jp-kddi', "\e\(I\x54\x2F\x4E\x5F\e(B"), decode('utf8', "ヤッポ"), 'half width katakana'; 
     8sub test_it { 
     9    my ($jis, $uni, $case) = @_; 
     10    $case ||= unpack "H*", $uni; 
     11     
     12    is decode("x-iso-2022-jp-kddi", $jis), $uni, "decoding $case"; 
     13    is $jis, encode("x-iso-2022-jp-kddi", $uni), "encoding $case"; 
     14} 
     15 
     16test_it("\e\$B\x75\x41\e(B", "\x{E488}", "pictogram"); 
     17 
     18test_it "a", decode('utf8', 'a'), 'alphabet'; 
     19test_it "\e\$B\x24\x57\e\(B", "\x{3077}", 'kanji(tora)'; 
     20 
     21is encode('x-iso-2022-jp-kddi', "\x{5bc5}"), encode('iso-2022-jp', "\x{5bc5}"), "kanji"; 
     22 
     23test_it "\e\$B\x75\x41\e(B", "\x{E488}", 'pictogram'; 
     24test_it "\e\$B\x75\x41\x76\x76\e(B", "\x{e488}\x{e51b}", 'pictogram'; 
     25test_it encode('iso-2022-jp', decode("utf8", "お")), decode('utf8', "お"), 'o'; 
     26test_it encode('iso-2022-jp', decode("utf8", "おいおい。山岡くん。kanbenしてくれよ!表示。")), decode('utf8', "おいおい。山岡くん。kanbenしてくれよ!表示。"), 'kanji, hiragana, alphabet'; 
     27test_it "\e\(I\x54\x2F\x4E\x5F\e(B", decode('utf8', "ヤッポ"), 'half width katakana'; 
     28 
    1429# is decode('x-iso-2022-jp-kddi', "\e\$(D\x2B\x21\x30\x57\e(B"), "\x{00E1}\x{4F0C}", 'JIS X 0212'; 
    15