変数内の文字列置換No.00487
Zuo さん 99/04/10 04:21
 
以前おなじようなことで質問されたツリーがありますが(292〜)
その時ひろさんが以下のような関数をつくってますよね。

main:
$$character="c:\\program files\\hidemaru";
call change_character $$character,"\\","/";
message $$return;
endmacro;

change_character:
##long=strlen($$1);
while(1){
##number=strstr($$1,$$2);
if(##number==-1)break;
else $$1=leftstr($$1,##number)+$$3+rightstr($$1,##long-##number-1);
}return $$1;

これって全角は処理できないんでしょうか?全角を変換しようとすると、
化けます。変数内の全角をうまく変換するような方法ってあります?

[ ]
RE:00487 変数内の文字列置換No.00488
安久津 さん 99/04/11 02:15
 
はじめまして Zuo さん、安久津といいます。

>これって全角は処理できないんでしょうか?全角を変換しようとすると、
>化けます。変数内の全角をうまく変換するような方法ってあります?

こんなのどうでしょう。

 call replaceS2withS3 "C:\\hmdata\\html\\index.html", "\\", "/";
 message $$return;
 call replaceS2withS3 "モノクロ秀丸よりカラー秀丸が好き","秀丸","液晶ディス
プレイ";
 message $$return;
 call replaceS2withS3 "少女ABC少AB少女D女A少女BCD少女AD女A","少女A","オバサ
ン";
 message $$return;
endmacro;
///// $$1 のなかの $$2 を $$3 に変える。
replaceS2withS3:
    $$str = $$1; $$s2 = $$2; $$s3 = $$3;
    ##len2 = strlen( $$s2 );
    // $$ret = "";
    while( 1 ){
        ##k = strstr( $$str, $$s2 );
        if( ##k == -1 ){
            $$ret = $$ret + $$str;
            break;
        }
        $$ret = $$ret + leftstr( $$str, ##k ) + $$s3;
        $$str = midstr( $$str, ##k + ##len2, strlen($$str) - ##k - ##len2 );
    }
return $$ret;
/////

ではでは。
# WWWブラウザでここに書き込むのは、かなりしんどいです。(^^;

[ ]
RE:00488 変数内の文字列置換No.00489
Zuo さん 99/04/12 02:33
 

>はじめまして Zuo さん、安久津といいます。>
>>これって全角は処理できないんでしょうか?全角を変換しようとすると、
>>化けます。変数内の全角をうまく変換するような方法ってあります?
>
>こんなのどうでしょう。
>
安久津様、うごきました。どうもありがとう、目的の動作に一歩近づきました。
感謝。

ついでにおしえてください。
全角数字の半角変換なんですが、tohankakuをつかうんですよね。
tohankaku $$return;
などでうまく動くとおもっていたのですが、エラーがでます。
この関数ってどうやってつかうんですか。

call replaceS2withS3 $$return,"0","0";

などを数字ぶんくりかえすという、あまりスマートでない方法で
とりあえずは間に合っているのですが。


[ ]
RE:00489 変数内の文字列置換No.00491
ひろ さん 99/04/12 12:10
 
 Zuo さん今日は、ひろです。
 私の以前に書いて subtoutine を変更すると
//--------------------------------------------------------------------------
-----
main:
$$character="c:¥¥program files¥¥hidemaru";
call change_character $$character,"¥","/";
message $$return;
endmacro;

change_character:
##change_char=strlen($$2);
while(1){
  ##long=strlen($$1);
  ##number=strstr($$1,$$2);
  if(##number==-1)break;
  else $$1=leftstr($$1,##number)+$$3+rightstr($$1,##long-##number-##change_
char);
}return $$1;
//--------------------------------------------------------------------------
-----
となります。
> 全角数字の半角変換なんですが、tohankakuをつかうんですよね。
 これは秀丸で開いた file を開き、範囲選択中の文字列を半角にするもの
です。

> などを数字ぶんくりかえすという、あまりスマートでない方法で
 ですから、開いている file の全ての数字を半角に変更する場合、
//-------------------------------------------------------------------
//英数記号の全角文字を半角に変換
main:
  disabledraw;
  #orgx=x;
  #orgy=y;
  call save_search;
  gofiletop;
  call search_hankaku;
  call reset_search;
  moveto   #orgx,#orgy;
  endmacro;

save_search://*******検索状態を保存
  #reg_search=getininum("hidemaru.ini","Env","SelectFound");
  if(!#reg_search){
    writeininum "hidemaru.ini","Env","SelectFound",1;
    envchanged;
  }$search=searchbuffer;
  #search=searchoption;
  return;

reset_search://******検索を初期状態に戻す
  if(!#reg_search){
    writeininum "hidemaru.ini","Env","SelectFound",#reg_search;
    envchanged;
  }setsearch $search, #search;
  return;

search_hankaku:
  searchdown "[0-9]+",regular;
  while(result){
    call zen2han;
    finddown;
  }findup;
  if(result)call han2zen;
  return;

zen2han:
  tohankaku;
  escape;
  return;
//-------------------------------------------------------------------
となります。

[ ]
RE:00489 変数内の文字列置換No.00492
安久津 さん 99/04/12 22:37
 
安久津です。
tohankaku については、ひろさんが書いているので、
私は、変数に格納された文字列を扱うことにします。

 $$str = "1234年5月6日7時8分09秒";
 call zenkakuNumToHankakuNum $$str;
 message $$return;
endmacro;
///// 文字列引数の中の全角数字を半角数字に変換する /////
zenkakuNumToHankakuNum:
    $$str = $$1; $$ret = "";
    ##iend = strlen( $$str );
    ##i = 0;
    while( ##i < ##iend ){
        ##code = ascii( midstr( $$str, ##i, 1 ) );
        if( ##code & 0xFF00 ){  // 全角の処理
            ##code = ascii( midstr( $$str, ##i, 2 ) ); // 全角の文字長 2
            if( ##code > 0x824E && ##code < 0x8259 ) ##code = ##code - 0x821
F;
            ##i = ##i + 2; // 全角なので 2 インクリメント
        }else{ // 半角の処理
            ##i = ##i + 1; // 半角なので 1 インクリメント
        }
        $$ret = $$ret + char( ##code );
    }
return $$ret;
/////// end of zenkakuNumToHankakuNum /////

以下は文字列変換の参考にして下さい。

全角なのか半角なのかの判定は、
##code = ascii( midstr( $$str, ##i, 1 ) );
if( ##code & 0xFF00 ){ // 全角の処理
で行います。σ(^^)
この判定方法を使うと、文字コードの一部が欠けること無く、
全角を含む文字列の変換が可能になります。

///// 文字列引数の中の半角英大文字を半角英小文字に変換する
stringToLowerCase:
    $$str = $$1; $$ret = "";
    ##iend = strlen( $$str );
    ##i = 0;
    while( ##i < ##iend ){
        ##code = ascii( midstr( $$str, ##i, 1 ) );
        if( ##code & 0xFF00 ){
            $$ret = $$ret + midstr( $$str, ##i, 2 );
            ##i = ##i + 2;
        }else{
            if( ##code > 64 && ##code < 91 ) ##code = ##code + 32;
            $$ret = $$ret + char( ##code );
            ##i = ##i + 1;
        }
    }
return $$ret;
///// end of stringToLowerCase /////

zenkakuNumToHankakuNum と stringToLowerCase の共通部分が、
全角と半角を含む文字列を変換する上で不可欠な部分です。
やりたいことは、if( ##code & 0xFF00 ){ }else{ } の中に書いてしまえば、
いいです。

話は変わりますが、ここのコメントツリーと発言00490 は関係しますか?
# 関係していたとしても、私が答える場合には3日後になります。(^^)/~~~

ではでは。
# やっぱり、WWWブラウザでここに書き込むのはしんどい。

[ ]
RE:00489 変数内の文字列置換No.00495
Zuo さん 99/04/16 01:38
 
どうも。ひろさま、安久津さまたびたびありがとうございます。
おかげさまで、変数内の文字列の操作がぐんとらくになりました。

「変数くらいもっと楽にいじらせてよ、秀丸君」と、ぼくの
内なる声が叫んでおりますが、関数の組み合わせ(サブルーチン)
次第ではなんとかなるもんだなと感動もしております。

ぼくがやりたいことは、490番の質問と連動していてます。ファイルの
なかに、かなりいいかげんに??月??日と書いた個所があるので、
そこから日付情報を取得してきて、半角に整え、出力というかんじです。

質問内容が、別のことのようにおもわれましたので、新しいツリーに
しました。

では。くわしくはそちらに。

[ ]
RE:00495 変数内の文字列置換No.00499
ひろ さん 99/04/16 18:03
 
 Zuo さん今日は、ひろです。
> なかに、かなりいいかげんに 12月25日と書いた個所があるので、
> そこから日付情報を取得してきて、半角に整え、出力というかんじです。
 「日付情報を取得」→「半角に変換」→「出力」は出来ると思います。し
かし日付の情報の部分の全角数字を半角数字に変えるだけなら、こんな面倒
な操作入りません。例えば、
//------------------------------------------------------------------
main:
  call save_search;
  gofileend;
  searchup "[11]?[1-91-9]月[ 1-31-3]?[1-91-9]日",regular;
  while(result){
    tohankaku;
    escape;
    findup;
  }
  call reset_search;
  endmacro;

save_search://*******検索状態を保持
  #reg_search=getininum("hidemaru.ini","Env","SelectFound");
  if(!#reg_search){
    writeininum "hidemaru.ini","Env","SelectFound",1;
    envchanged;
  }$search=searchbuffer;
  #search=searchoption;
  return;

reset_search://******検索を初期状態に戻す
  if(!#reg_search){
    writeininum "hidemaru.ini","Env","SelectFound",#reg_search;
    envchanged;
  }setsearch $search, #search;
  return;
//-------------------------------------------------------------------
てな感じです。

[ ]
RE:00495 変数内の文字列置換No.00898
ENCODINGSHIFTJIS さん 99/12/07 09:46
 
>「変数くらいもっと楽にいじらせてよ、秀丸君」と、ぼくの

マクロ集、田楽サーバーの文字列サービスも試してみて下さい。
常駐使用すると快調です。



[ ]