丸囲み数字の置換No.37376
さん 09/11/24 00:30
 
こんにちは、

機種依存文字の『@』などの丸囲み数字を受信時に
全てUnicodeに置き換えたいのですが、
受信時に自動的に文字列の置換を行うマクロの書き方がわからず躓いてしまいました。

そのようなマクロはあるのでしょうか?
また作成の例になるものでもあると助かります。

[ ]
RE:37376 丸囲み数字の置換No.37385
秀まるお2 さん 09/11/24 10:14
 
 受信したメールすべてに置換をかけることは、一応マクロで出来るといえば出
来ますが、あんまりお勧めしないです。なぜかというと、マクロでやるためには、
受信したメール1つ1つ選択する動作をループさせてやる必要がありまして見た
目がかなりよくないからです。

 もしも受信したメールすべてに対してやるとしたら、

    loaddll "tkinfo.dll";
    if( dllfunc("RecvMailCountShow") == 0 ) {
        endmacro;
    }
    while( dllfunc("SelectRecvMail") ) {
        #n = dllfunc("BeginEditMail");
        if( readonly ) {
            readonlyswitch;
        }
        replaceallfast "@", "(1)";
        if( result != 0 ) {
            #n = dllfunc("SaveEditMail", 0, 1);
        } else {
            #n = dllfunc("CancelEditMail");
        }
    }

 のようなマクロになります。上記マクロのreplaceallfastの所を好きなように
書き換えればいいかと思います。

 SelectRecvMail関数には制限もあるので、その辺はマクロヘルプも参照して欲
しいです。あと、SelectRecvMailInFolder関数を使えば特定のフォルダに届いた
メールに限って処理することも出来ます。


 それと、僕には「すべてUnicodeに置き換える」という意味がいまいちよく分
かりませんけども…。ユニコードでもなんでも、丸付き数字は丸付き数字で変わ
りないと思います。

[ ]
RE:37385 丸囲み数字の置換No.37406
さん 09/11/28 00:39
 
返信ありがとうございます。

> 受信したメールすべてに置換をかけることは、一応マクロで出来るといえば出
>来ますが、あんまりお勧めしないです。なぜかというと、マクロでやるためには、
>受信したメール1つ1つ選択する動作をループさせてやる必要がありまして見た
>目がかなりよくないからです。
>
> もしも受信したメールすべてに対してやるとしたら、
>
>    loaddll "tkinfo.dll";
>    if( dllfunc("RecvMailCountShow") == 0 ) {
>        endmacro;
>    }
>    while( dllfunc("SelectRecvMail") ) {
>        #n = dllfunc("BeginEditMail");
>        if( readonly ) {
>            readonlyswitch;
>        }
>        replaceallfast "@", "(1)";
>        if( result != 0 ) {
>            #n = dllfunc("SaveEditMail", 0, 1);
>        } else {
>            #n = dllfunc("CancelEditMail");
>        }
>    }

こちらのマクロを replace_circular_num.mac で保存して
[マクロ登録]の[自動起動]の[受信が一段落した時] に追加し
新規メールを送信&受信したのですが、置換されませんでした。
追加の方法を間違えてるのでしょうか?

> それと、僕には「すべてUnicodeに置き換える」という意味がいまいちよく分
>かりませんけども…。ユニコードでもなんでも、丸付き数字は丸付き数字で変わ
>りないと思います。

私もまるおさんの書き込みを見て気づいたのですが、
したい事は機種依存文字を使わない事なので、置換ではなくメールのエンコード自体
を変える必要がありました。
http://ja.wikipedia.org/wiki/%E4%B8%B8%E6%95%B0%E5%AD%97

つまり iso-2022-jp で規定されていない丸文字が iso-2022-jp で書かれたメール内
に入っていた時にUTF-8に自動変換させたく思います。

やはりこれもあまり推奨されない方法になってしまうのでしょうか?

[ ]
RE:37406 丸囲み数字の置換No.37407
秀まるお2 さん 09/11/28 09:31
 
 マクロは、一応僕の所で簡単なテストをした限りではうまく動いたはずなんで
すが、もううまく動かないとしたら、例えばマクロのあちこちにmessage文を埋
め込んで、それで具体的にどこが動いてどこがダメなのか確認するようなことを
していただく作戦になりますけども…

> したい事は機種依存文字を使わない事なので、置換ではなくメールのエンコード自体
> を変える必要がありました。
> http://ja.wikipedia.org/wiki/%E4%B8%B8%E6%95%B0%E5%AD%97

 ということでしたら、どっちにしても機種依存文字変換のマクロは不要という
ことで、前回のマクロの話は無しにさせていただきまして…

 受信したメールをutf-8に変換するということでしたら、とりあえず手っ取り
早く、「全般的な設定・上級者向け・デコード」の「受信したメールは全部ユニ
コード化する」をONにして、全部ユニコードにしてしまう作戦もありますけど、
それではダメなんですかね。

 なんだかそもそもの目的が何なのかもよく分からないのであまり適当なコメン
トが出来ませんけども…。機種依存文字といってても、丸付き数字程度でしたら
そんなに気にする必要は無いんじゃないかと思います。

 (秀丸メールでの機種依存文字についての警告メッセージもデフォルトOFFに
しようかなぁと思ったりもします)

[ ]
RE:37407 丸囲み数字の置換No.37408
さん 09/11/28 13:41
 
設定に「受信したメールは全部ユニコード化する」があることを知りませんでした。
これでやりたい事ができます、ありがとうございます。

ただ、マクロでの受信時の置換は他にも使いたいことがありますので、できれば今回
解決させておきたく思っています。

    loaddll "tkinfo.dll";
    if( dllfunc("RecvMailCountShow") == 0 ) {
        endmacro;
    }
    while( dllfunc("SelectRecvMail") ) {
        #n = dllfunc("BeginEditMail");
        if( readonly ) {
            readonlyswitch;
        }
        message("do replace");
        replaceallfast "test", "replaced";
        message("done replace");
        if( result != 0 ) {
            message("not 0");
            #n = dllfunc("SaveEditMail", 0, 1);

        } else {
            message("0");
            #n = dllfunc("CancelEditMail");
        }
    }

こうmessage文を追加したところ、"do replace" "done replace" "0" の順番でダイ
アログが表示されます。
もちろんメール本文にtestの文字列は入れています。

replaceallfast を replaceall に変えてみましたが、やはり置換部分が動いていな
いようです。
どこがおかしいか、何かわかりますでしょうか?

[ ]
RE:37408 丸囲み数字の置換No.37409
山紫水明 さん 09/11/28 17:45
 
 砂さん,

>どこがおかしいか、何かわかりますでしょうか?

if( browsemode ) browsemodeswitch;
を追加してもだめでしょうか?

                                    山紫水明
                                    SANSHISUIMEI

[ ]
RE:37409 丸囲み数字の置換No.37410
秀まるお2 さん 09/11/28 20:38
 
 僕もテストしてみたんですが、たしかに山紫水明さんのその処理が必要でした。
大変失礼しました。

        #n = dllfunc("BeginEditMail");
        if( readonly ) readonlyswitch;
        if( browsemode ) browsemodeswitch;
        replaceallfast "test", "replaced";

 のようにすればうまく置換すると思います。

[ ]
RE:37410 丸囲み数字の置換No.37516
さん 09/12/12 09:27
 
山紫水明さん, まるおさん,

browsemodeswitch を挿入すれば置換を行えました。
ありがとうございます。

[ ]