マクロによるコード値での検索&グレップNo.05032
マボカル さん 06/02/01 00:43
 
マボカルと申します。ピントがずれているかも知れませんが、漠然と
考えていることがあって質問いたします。

あるファイルを対象にマクロを使って検索またはグレップを行いたいと
考えていますが、普通の文字としての検索語を書き入れるのではなく、
その文字の文字コードを使って検索することも可能でしょうか?

質問の意図としては、例えばユニコードのファイルをマクロではなく
一般の検索から文字を入力もしくはコピペした場合、検索が可能ですが
予めある漢字のの範囲を検索する目的で [X-X] のようにXの部分に
SJIS以外の漢字を入れてマクロを作ろうとしても、マクロが
SJISでないとダメなので、SJISで保存すると [X-X] 部分が
当然文字化けしてしまうのです。

そこで文字コードを検索語にして、文字を検索できないかと考えて
いるわけです。そのほかの方法でも結構ですが、マクロ内で
SJIS以外の文字を検索することが出来るのでしょうか?

[ ]
RE:05032 マクロによるコード値での検索&No.05033
マボカル さん 06/02/01 00:54
 
やや誤解を招きそうな表現となってしまったので、補足説明しますが、
ユニコードの文字を一般の検索でも [X-X] の形式で検索した場合は
エラーが出ますが、[X-X] のような文字コードの範囲として設定する
のではなく(X|X|X|X|X|X|X|X|X|X) のようにグループ化して検索すると
上手く行きます。

しかしこれをマクロ内でやろうとすると、マクロファイルの文字コード
の関係で上手くいきません。

[ ]
RE:05032 マクロによるコード値での検索&No.05034
h-tom さん 06/02/01 01:33
 

h-tom です。

>そこで文字コードを検索語にして、文字を検索できないかと考えて
>いるわけです。そのほかの方法でも結構ですが、マクロ内で
こんな感じですか?
//searchdown "[亜-腕]",regular;
//searchdown "[\x88\x9f-\x98\x72]",regular;
//searchdown "秀丸",regular;
searchdown "\x8F\x47\x8A\xDB",regular;
endmacro;

シフトJIS以外の文字を検索できるかどうかはわかりません。

[ ]
RE:05034 マクロによるコード値での検索&No.05035
マボカル さん 06/02/01 11:45
 
h-tomさん

ご解答ありがとうございます。

>こんな感じですか?
>//searchdown "[亜-腕]",regular;
>//searchdown "[\x88\x9f-\x98\x72]",regular;
>//searchdown "秀丸",regular;
>searchdown "\x8F\x47\x8A\xDB",regular;
>endmacro;
>
>シフトJIS以外の文字を検索できるかどうかはわかりません。

16進数の文字コードを\xで2つずつ区切って表記するのですね。
SJISでは問題ありませんが、ユニコードではNGのようです。

例えば

[退-黽]

の範囲を

[\x90\x00-\x9e\xfd]

とユニコード(UTF-16)で書き込んでも秀丸英語版では「Invalid Regular Expressi
on」とエラーメッセージが出ますね。これは
マクロ内だけでなく、普通の検索の場合でもNGです。正規表現の
検索語にユニコードが入ってはダメだということですね。

ちなみに韓国語XP+秀丸英語版では、ローカルコード(韓国語)の
文字コード(Hangul)のファイルに対して、ローカルコードで
(韓国語)マクロを作成した場合は [X-X] の範囲指定でもいけます。
ただしこの場合、search系はOKですが、localgrepは失敗します。

あと韓国語の文字コードでは、ハングル部分はsearch系で確実に全ての
文字にヒットしますが、漢字の部分は失敗します。同じ文字コード内
にあって、同じ条件でハングルと漢字を検索しても違う動きをする
ということは、日本語の漢字と韓国語の漢字が衝突しているために
エラーがでるのでしょうか?

この辺は秀丸エディタの普通の使い方ではないので、報告だけに留め
たいと思います。

マクロ内におけるユニコードの文字の検索&グレップというのは結論
からいって無理なのでしょうか?そのほかの方法はあります
でしょうか。

[ ]
RE:05035 マクロによるコード値での検索&No.05036
マボカル さん 06/02/01 19:49
 
ユニコードファイルに対して、マクロ内でユニコードの文字を検索する
場合、次の方法で動作を確認しました。

例えばSJISにも入っている「退」の漢字の場合、

$code = unichar( 0x9000 );
searchdown $code ;

とすると検索されました。勿論 4E00-9FFF の範囲にあるSJISでは
表示できない漢字でも

http://www.nii.ac.jp/CAT-ILL/PUB/font/www/table/

上の方法で検索やローカルグレップが可能した。

ただ、これを [X-X] のように範囲指定するとダメです。

$code1 = unichar( 0x9000 );
$code2 = unichar( 0x9fa5 );
searchdown "[" + $code1 + "-" + $code2 + "]" , regular;

HMJRE.dllがユニコードに対応していないので、正規表現の検索では
ユニコードが含まれるととにかく無理ということでしょうか。
この場合でも範囲指定ではなく、グループ化して

searchdown "(" + $code1 + "|" + $code2 + ")" , regular;

のように検索するときちんと検索されます。 [X-X] で範囲指定すると
HMJRE.dll側で文字コードの配列順序を認識できないと理解しても
よろしいのですね。

将来的にHMJRE.dllをユニコード対応にしてもっと強化することは
できますでしょうか。

[ ]
RE:05036 マクロによるコード値での検索&No.05037
マボカル さん 06/02/01 19:54
 
ちなみに検索は出来てもグレップが出来ない現象というのは原因が
何でしょうか?以下のように検索はOKですが、

searchdown "(" + $code1 + "|" + $code2 + ")" , regular;

これがグレップになると

localgrep "(" + $code1 + "|" + $code2 + ")" , regular;

検索される文字とそうでない文字があって、正確な結果が出ません。
韓国語XPという問題もあるのでしょうか?この問題はユニコード
のファイルおよび検索語がユニコード文字ということに関わらず、
SJISのファイルでSJIS内の文字コードで検索した場合にも
発生します。まだ規則性が分からないので不安です。

[ ]