[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 メーリングリストの案内