[Mew-dist 04017] Re: charset=shift_jis

SAKAI Kiyotaka ksakai at example.com
1998年 2月 28日 (土) 00:40:28 JST


>> In article <19980227183854B.utashiro at example.com>, Kazumasa Utashiro <utashiro at example.com> writes:

>> +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 だとすると、このプログラムはうまく動作しな
> いと思います。

すいません、コードをちゃんと読んでいなかったのですが、この最初の if の
部分は削るべきでしたね。

> また、この場合 EUC の SS2 の MSB を落して返していますが、これは外側で
> よろしくやっているんでしょうか。

> 絶対に来ないことが保証されているのなら、まあ構わないんですが、ちょっと
> 気になったもので。

はい、外側で次のようなルーチンをかぶせています。こうしないと、エスケー
プシークエンスの挿入ができないと思いますので。

sub shift_jis_to_ctext ($) {
    my $str = shift;
    $str =~ s/(([\x81-\x9f\xe0-\xef].)+)/"\e\$(B" . s2j($1) . "\e(B"/ge;
    $str =~ s/([\xa0-\xdf]+)/\e)I\1\e-A/g;
    return $str;
}
-- 
酒井 清隆 (E-mail: ksakai at example.com)



Mew-dist メーリングリストの案内