Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 全角半角変換



臼田です。

knok@xxxxxxxxxxxxx wrote:
>   元々(1.x時代)は、割と全角/半角文字の正規化はちゃんとしていたのではい
> ないかと思います。
> 
>   各種 filter が増えてきたところで、その出力が変換するツールによってま
> たさまざまに変化するようになってきていて、その辺りへのケアが不十分なま
> ま現在に至っている、というのが私の認識です。
>   扱いの明確なルールというのはないと思います。
>
>   Encode.pm の採用という最近の話題も考慮すると、やはり nkf に依存しな
> い処理を用意する方向が良いように思います。

Tadamasa Teranishi wrote:
> Perl 5.8 対応と、indexのutf-8化の話と、全角/半角変換の話はそれぞれ
> わけて考えた方が良いと思います。
> 
> 少なくても現状の 2.0 系は nkf にあわせるのが無難かと。

2.0系での(nkfでないツールで)eucにコード変換した後の正規化処理ですが
当面、nkfと比べて現状で足りないものについて
 ・EUC半角カナの全角化:codeconv:eucjp_han2zen_kana()を利用可能
 ・全角英数のASCII化:変換ルーチンが不足
 ・全角記号の半角化:nkfでは実施しているが無視してもよい?

であるとしてnkfの出力に近づけるため下記の2つのサブルーチンを
codeconv.plに追加して
codeconv::normalize_euc_jp(\$tmp);
のようにtaro7_10.plから呼び出そうと思います。
問題がなくて、統一した方がよければlvで文字コード変換している他の
フィルターでも呼び出すようにしようと思います。
(似たような名前のサブルーチンがmknmz内にもあるのでサブルーチンの
名前で良い案があれば変更したいです)

$ diff  codeconv.pl.org codeconv.pl
151a152,166
> sub eucjp_zen2han_ascii ($) {
>     my ($str) = @_;
>     if (util::islang("ja")) {
>         $str =~ s/\xa3([\xb0-\xb9\xc1-\xda\xe1-\xfa])/pack("C",unpack("C",$1)-0x80)/ge;
>     }
>     $str;
> }
> sub normalize_euc_jp ($) {
>     my ($contref) = @_;
>     if (util::islang("ja")) {
>         $$contref = codeconv::eucjp_han2zen_kana($$contref);
>         $$contref = codeconv::eucjp_zen2han_ascii($$contref);
>     }
>     $contref;
> }

現状ではアルファベットの大文字→小文字の正規化がどこか別のところで
行われているようなので、2.1系に向けては可能であれば正規化処理も複数
箇所で行わずにどこかに集めてあげることになると思います。
(ウムラウト付き文字なども正規化したほうが検索しやすいのかもしれない
とふと思いついたので正規化ルールは整理する必要が要りますね)

臼田幸生