[Mew-dist 04013] Re: charset=shift_jis
Kazumasa Utashiro
utashiro at example.com
1998年 2月 27日 (金) 18:39:07 JST
From: SAKAI Kiyotaka <ksakai at example.com>
Subject: [Mew-dist 04011] Re: charset=shift_jis
Date: Fri, 27 Feb 1998 14:47:50 +0900
> # sjis -> jis への変換ルーチンは、Japanese.pm にあったものを借りて使っ
> # ています。
> +sub s2j($) {
> + my $str = shift;
> + my ($c1, $c2);
> + my $ret = "";
> +
> + while ($str) {
> + ($c1, $c2, $str) = unpack('CCa*', $str);
> + if (0xa1 <= $c1 && $c1 <= 0xdf) {
> + $c2 = $c1;
> + $c1 = 0x8e;
> + } elsif ($c2 >= 0x9f) {
> + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe0 : 0x60);
> + $c2 += 2;
> + } else {
> + $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe1 : 0x61);
> + $c2 += 0x60 + ($c2 < 0x7f);
> + }
> + $c1 &= 0x7f;
> + $c2 &= 0x7f;
> + $ret .= pack('CC', $c1, $c2);
> + }
> + return $ret;
> }
コンテキストを理解せずにこのパッチだけ見てコメントしますが、最初の if
文は X 0201 仮名の処理で、この場合は1バイトだけ $str から取らないとい
けません。入力が本当に SJIS だとすると、このプログラムはうまく動作しな
いと思います。
また、この場合 EUC の SS2 の MSB を落して返していますが、これは外側で
よろしくやっているんでしょうか。
絶対に来ないことが保証されているのなら、まあ構わないんですが、ちょっと
気になったもので。
--utashiro
Mew-dist メーリングリストの案内