[Mew-dist 04066] Re: charset=shift_jis

Kazumasa Utashiro utashiro at example.com
1998年 3月 3日 (火) 14:25:17 JST


From: SAKAI Kiyotaka <ksakai at example.com>
Subject: [Mew-dist 04063] Re: charset=shift_jis
Date: Tue, 3 Mar 1998 10:54:35 +0900

> > とすると、仮名が終わった後で G1 に Latin-1 を designate して、次にまた
> > 仮名が出て来た時に X0201 を designate するのが冗長になるわけですが、こ
> > れは気にしないか、その方がいいという判断ですね。
> 
> > ただ、漢字と仮名が繰り返し出て来る文章の場合は、
> 
> > 	ESC-$(B ...漢字... ESC-)I ...仮名... ESC-A ...漢字... ESC-(B
> 
> > としたい気がします。しかし「漢字-仮名-ASCII」と続いたら、何処で G0 を 
> > ASCII に戻すのか... この辺が正規化が難しいという結縁なんですね。
> 
> では、この 2つも頑張ってやるようにしてみました。

多分、戻すのは仮名の後がいいと思うんですが、今度は「仮名-漢字」とはじ
まった時に、いつ X0208 を designate するかという問題があって、こっちは
かなり難しいですねえ。

なんとなく、jcode.pl 用の外部ライブラリを作ってみました。最初のが、ほ
ぼ上に書いたような仕様になっていて、「仮名-漢字」の時は漢字がはじまる
所で X0208 を designate して、漢字の後で G0 と G1 を元に戻します。

で、作りながら考えたのですが、日本語の文字列の前後を designator で囲ん
で、その中ではコードの指示は行わないというのが、わりときれいでわかりや
すいような気がしてきました。最初と最後に必要に応じて G0 と G1 の一方あ
るいは両方を切り替えるわけです。これを実装してみたのが2番目です。

Mule の *ctext* は、G1 は行末に戻すようですね。

--utashiro

-------------- next part --------------
require 'jcode.pl';

package jcode;

$convf{'sjis', 'ctext'} = *sjis2ctext;

;#
;# SJIS to CTEXT
;#
sub sjis2ctext {
    local(*_, $opt, $n) = @_;
    &sjis2sjis(*_, $opt) if $opt;
    s/($re_sjis_kana|$re_sjis_c)+/&_sjis2ctext($&)/geo;
    $n;
}
sub _sjis2ctext {
    local($_) = shift;
    local($G0) = 'ASCII';
    s/($re_sjis_kana)+|($re_sjis_c)+/&__sjis2ctext($&)/geo;
    $_ .= "\e(B" if $G0 ne 'ASCII';
    $_;
}
sub __sjis2ctext {
    local($_) = shift;

    if (/^$re_sjis_kana/o) {
	$n += length($_);
	"\e)I" . $_ . "\e-A";
    } else {
	$n += s/$re_sjis_c/$s2e{$&}||&s2e($&)/geo;
	tr/\241-\376/\041-\176/;
	if ($G0 eq 'ASCII') {
	    $G0 = 'JISX0208';
	    $_ = "\e\$(B" . $_;
	}
	$_;
    }
}
-------------- next part --------------
require 'jcode.pl';

package jcode;

$convf{'sjis', 'ctext'} = *sjis2ctext;

;#
;# SJIS to CTEXT
;#
;# ----------------------------------------------------------
;# KANJI       ESC-$-(-B          KANJI               ESC-(-B
;# KANA                  ESC-)-I  KANA        ESC---A
;# KANJI+KANA  ESC-$-(-B ESC-)-I  KANJI+KANA  ESC---A ESC-(-B
;# ----------------------------------------------------------
;#
sub sjis2ctext {
    local(*_, $opt, $n) = @_;

    &sjis2sjis(*_, $opt) if $opt;
    s/($re_sjis_kana|$re_sjis_c)+/&_sjis2ctext($&)/geo;
    $n;
}
sub _sjis2ctext {
    local($_) = shift;
    local($pre, $post) = ('', '');

    if (/$re_sjis_c/) {
	($pre, $post) = ("\e\$(B", "\e(B");
    }
    if (/$re_sjis_kana/) {
	($pre, $post) = ($pre . "\e)I", "\e-A" . $post);
    }
    s/($re_sjis_c)+/&__sjis2ctext($&)/geo;
    $pre . $_ . $post;
}
sub __sjis2ctext {
    local($_) = shift;

    $n += s/$re_sjis_c/$s2e{$&}||&s2e($&)/geo;
    tr/\241-\376/\041-\176/;
    $_;
}


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