文字列変数内での全角かな文字の判断No.02965
Micky さん 02/01/24 21:29
 
まいどお世話になります。

きっとヘルプのどこかに書いてあるのだろうと思いながら投稿しています。
(勿論かなり探したのですが、探し出せないのです)

マクロ内で選択範囲が全角かな文字を含むか判断をしたくて、
変数に取り込み、
#temp = ascii( midstr( $wk1, #point, 1 ) );
if ((0x829F <= #temp) && (#temp <= 0x82F1))// ぁ〜ん

というようなことをして1文字ずつ判断しようかと思ったのですが、
どうも思ったように動いてくれません。

midstr で切り出す文字数を2にすればうまく全角文字が取り出せたのですが、
半角文字が混ざっていると・・・

どうやるのが正解でしょう?

[ ]
RE:02965 文字列変数内での全角かな文字のNo.02966
Micky さん 02/01/24 21:42
 
まいどお世話になります。

Micky wrote:
> マクロ内で選択範囲が全角かな文字を含むか判断をしたくて、
> 変数に取り込み、
> #temp = ascii( midstr( $wk1, #point, 1 ) );
> if ((0x829F <= #temp) && (#temp <= 0x82F1))// ぁ〜ん
正解かどうかは?ですが、
読み取りポインタ(#point)を1ずつ進めていたのですが、
全角文字のときは2文字進める必要があるようです。
一応目的の動きは達成できました。
お騒がせしました。

[ ]
RE:02966 文字列変数内での全角かな文字のNo.02967
きいろいまふらあ さん 02/01/25 00:44
 
>> マクロ内で選択範囲が全角かな文字を含むか判断をしたくて、
>> 変数に取り込み、

>読み取りポインタ(#point)を1ずつ進めていたのですが、
>全角文字のときは2文字進める必要があるようです。

midstr()関数の使い方としては正解と思います。

変数に取り込まずに、編集画面上でカーソルを移動しながら文字コードを調べる
のも一つの手と思います。
場合によっては、選択範囲を記憶しておいて、処理後再度選択してやるような処
理が必要かもしれませんけど。

[ ]
RE:02967 文字列変数内での全角かな文字のNo.02968
Micky さん 02/01/25 08:58
 
まいどお世話になります。

きいろいまふらあ さん wrote:
> midstr()関数の使い方としては正解と思います。
よくよく考えてみると「あたりまえ」ですかね。

> 変数に取り込まずに、編集画面上でカーソルを移動しながら文字コードを調べる
> のも一つの手と思います。
そーなんですが、

> 場合によっては、選択範囲を記憶しておいて、処理後再度選択してやるような処
> 理が必要かもしれませんけど。
これがいやだったので、変数に取り込んでやっています。
選択範囲が狭いうちは良いのですが、広くなってくると速度的に
つらいとは思うのですが、「まふさん」ならどちらを選択されます?
って書いてて、一行しか処理していないことに気が付きました。
こうなってくるとカーソル動かした方が楽ですかね。
ありがとうございました。

[ ]
RE:02968 文字列変数内での全角かな文字のNo.02969
ENCODINGSHIFTJIS さん 02/01/25 11:31
 
開発中ので試してみました、スクリプトと同じ書き方でできました。

 02936 BREGEXP DLL ラッパーDLL / 杉浦 まさき - 02/01/15
http://www.MARUO.co.jp/hidesoft/4/m020115.html#2936

----------------------------------- textBRE.mac
// BREGEXP DLL
// http://www.hi-ho.ne.jp/babaq/bregexp.html

   loaddll "BRE_Wrap.dll";
   if( !result ) {
       message "BRE_Wrap.dllのロードに失敗しました。";
       endmacro;
   }
//   message dllfuncstr("BRE_VERSION");
selectline
$tempstr = gettext(seltopx,seltopy,selendx,selendy);
menu $tempstr;
message dllfuncstr("BRE_MATCH","/[ぁ-ん]/k",$tempstr);
message dllfuncstr("BRE_ERRORMSG");
   // ん
      freedll;
-------------------------------------
カーソル行の検索をします。

[ ]
RE:02969 文字列変数内での全角かな文字のNo.02970
Micky さん 02/01/25 12:00
 
まいどお世話になります。

ENCODINGSHIFTJIS さん wrote:
> 開発中ので試してみました、スクリプトと同じ書き方でできました。
なるほど、dllにしてしまえば速度は気にならないでしょうね。

今回は一応出来てしまったのと、
選択範囲が広くなることがほとんど無いと思われる為、
現状のまま使ってみようと思います。

わざわざテストまでしていただいてありがとうございました。

[ ]
RE:02966 文字列変数内での全角かな文字No.02971
JRくん さん 02/01/26 00:22
 

》> #temp = ascii( midstr( $wk1, #point, 1 ) );
》> if ((0x829F <= #temp) && (#temp <= 0x82F1))// ぁ〜ん

》全角文字のときは2文字進める必要があるようです。

個人的には、秀丸の ascii関数の仕様からすると、
「#temp = ascii( midstr( $wk1, #point, 2 ) ); として
 半角文字のときは1文字、全角文字のときは2文字進める」
が正解と思います。
02670のツリーを参照ください。


[ ]
RE:02968 文字列変数内での全角かな文字のNo.02972
きいろいまふらあ さん 02/01/27 15:07
 
>> 場合によっては、選択範囲を記憶しておいて、処理後再度選択してやるような処
>> 理が必要かもしれませんけど。
>これがいやだったので、変数に取り込んでやっています。

既に検討済みであったのであれば余計なお世話でした。
あくまで「こーいうアプローチもあるよ」というだけの話です。

>選択範囲が狭いうちは良いのですが、広くなってくると速度的に
>つらいとは思うのですが、「まふさん」ならどちらを選択されます?

自分で作ってみないとわかりません。(^^;

「選択範囲に全角かな文字があるか否か」という判断だけ(見つけた全角かな文
字を処理したりしない)なら、正規表現による検索で見つかるか否かで済む気も
しますけど。

なんにしても、そもそもの使い方とか、その後(全角かな文字があるかどうかを
調べた後)何をするかによっても、マクロの書き方は変わってくるものだと思い
ます。

あとは、そのときの気分とか、体調とか、時間の都合とかにもよります。(^^;

ま、確かに(処理内容によっては)選択範囲を記憶しておいて、あとからもう一
度選択し直してやるのってすごく大変かもしれません(自爆)。

[ ]
RE:02972 文字列変数内での全角かな文字のNo.02973
ひろ さん 02/01/27 19:46
 
 Micky さん、きいろいまふらあさん今日は、ひろです。
> ま、確かに(処理内容によっては)選択範囲を記憶しておいて、あとからもう一
> 度選択し直してやるのってすごく大変かもしれません(自爆)。
 確かに面倒ですね。gettext を使う場合、末尾のようなサブルーチンを、
自分用のサブルーチン集から C&P しています。

gettext2://範囲選択を解除しない gettext(##1,##2,##3,##4)
  if( selecting ){
    if( x == seltopx && y == seltopy ){
      ##topx = selendx;
      ##topy = selendy;
      ##endx = seltopx;
      ##endy = seltopy;
    }
    else{
      ##topx = seltopx;
      ##topy = seltopy;
      ##endx = selendx;
      ##endy = selendy;
    }
    left;//カーソル移動の設定と関わり無く「選択開始」実行中なら、
         //選択範囲が解除されない
    if( selecting )##beginsel = 0;//マクロの都合上、「選択開始」実行中なら、
                                  //0 にしておく
    else ##beginsel = 1;
    $$text = gettext(##1,##2,##3,##4);
    moveto ##topx,##topy;
    beginsel;
    moveto ##endx,##endy;
    if( ##beginsel )endsel;
  }
  else $$text = gettext(##1,##2,##3,##4);
  return $$text;

[ ]
RE:02973 文字列変数内での全角かな文字のNo.02974
きいろいまふらあ さん 02/01/28 01:29
 
参考になります。>ひろさん

言葉足らずでしたが、間に入る処理がひろさんの書かれた例のように編集を伴わ
ないものの場合は簡単だけど、そうでない場合は大変だということでした。

[ ]
RE:02973 文字列変数内での全角かな文字のNo.02975
Micky さん 02/01/28 21:56
 
まいどお世話になります。

ひろ さん wrote:
>  確かに面倒ですね。gettext を使う場合、末尾のようなサブルーチンを、
> 自分用のサブルーチン集から C&P しています。
ありがとうございます。
今後のために保存させていただきます。

[ ]
RE:02972 文字列変数内での全角かな文字のNo.02976
Micky さん 02/01/28 21:56
 
まいどお世話になります。

きいろいまふらあ さん wrote:
> あくまで「こーいうアプローチもあるよ」というだけの話です。
ありがとうございます。

> なんにしても、そもそもの使い方とか、その後(全角かな文字があるかどうかを
> 調べた後)何をするかによっても、マクロの書き方は変わってくるものだと思い
> ます。
やりたいことによって、ケースバイケースって事ですね。
よく人には「最終的には何がしたいの?」って聞いているのですが、
自分がそうしていませんでした。そのうちマクロ登録しておきますネ。

[ ]
RE:02971 文字列変数内での全角かな文字No.02977
Micky さん 02/01/28 21:56
 
まいどお世話になります。

JRくん さん wrote:
> 個人的には、秀丸の ascii関数の仕様からすると、
> 「#temp = ascii( midstr( $wk1, #point, 2 ) ); として
>  半角文字のときは1文字、全角文字のときは2文字進める」
> が正解と思います。
なるほど、

> 02670のツリーを参照ください。
つい先日出ていたのですね。
このとき読み飛ばしていなければ皆さんのお手を煩わせずにすんだわけですね。
申し訳ありませんでした。

[ ]