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