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