[ 新規に投稿する ]

添付ファイル保存マクロで文字化けNo.00179
tera-km さん 26/08/25 08:46 [ コメントを投稿する ]
  おはようございます。お世話になります。

添付ファイルをsubjectの文字を取得して保存するマクロで時折文字化けが発生するのを抑制したいです。

subjectはオリジナルでは無く私が直接打ち換えた日本語です。
文字化けするときとしないときの条件が見いだせたいないです。

うちのAI君、私の質問が悪いのか解決に至らないでエラーばかり繰り返すのでここで質問いたしました。ご教示のほどお願いいたします。


loaddll "TKInfo.dll";

// 保存先
$SaveDir = "C:\\Users\\user\\Desktop";

// サブジェクト取得
$Subject = dllfuncstr("CurrentHeader", "Subject");
if ($Subject == "") {
    message "サブジェクトが取得できません。";
    endmacro;
}

// Windows禁止文字削除
call SanitizeFileName $Subject;
$Subject = $$return;

// 添付ファイル数取得
#cnt = dllfunc("CountCurrentHeader", "X-Attach");
if (#cnt < 1) {
    message "添付ファイルがありません。";
    endmacro;
}

##i = 0;
while (##i < #cnt) {

    // 添付ファイルの相対パス
    $AttachFile = dllfuncstr("CurrentHeader2", "X-Attach", ##i);

    // フルパス
    $FullPath = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $AttachFile;

    // 拡張子取得
    call GetExt $AttachFile;
    $Ext = $$return;

    // 保存名作成
    if (##i == 0) {
        $NewName = $Subject + "月日" + $Ext;
    } else {
        $NewName = $Subject + "(" + str(##i+1) + ")月日" + $Ext;
    }

    // 保存先フルパス
    $SavePath = $SaveDir + "\\" + $NewName;

    // DLL経由でコピー
    #ret = dllfunc("Bypass_CopyFile", $FullPath, $SavePath);
    if (#ret == 0) {
        message "保存に失敗:" + $SavePath;
    } else {
        // ★ここに入れる
        run "attrib -r \"" + $SavePath + "\"";
    }

    ##i = ##i + 1;
}

message "添付ファイルを保存しました。";
freedll;
endmacro;


//--------------------------------------
// 拡張子取得
//--------------------------------------
GetExt:
{
    $f = $$1;
    #p = strstr($f, ".");
    if (#p < 0) {
        return "";
    }
    #len = strlen($f);
    return rightstr($f, #len - #p);
}


//--------------------------------------
// Windows禁止文字削除(安全版)
//--------------------------------------
SanitizeFileName:
{
    $s = $$1;

    // Windows禁止文字(ダブルクォーテーションは別扱い)
    $bad = "\\/:*?<>|";

    #i = 0;
    #len = strlen($s);
    $r = "";

    while (#i < #len) {
        $c = midstr($s, #i, 1);

        // $bad に含まれず、かつダブルクォーテーションでもない
        if (strstr($bad, $c) < 0 && $c != "\"") {
            $r = $r + $c;
        }

        #i = #i + 1;
    }

    return $r;
}
[ ]
RE:00179 添付ファイル保存マクロで文字化けNo.00180
秀まるお さん 26/08/25 08:56 [ コメントを投稿する ]
  詳しく検証した訳では無いのですが、SanitizeFileNameって関数が日本語やユニコード文字に対応してないのが原因だと思います。

$c = midstr($s, #i, 1);

のようにしてしまうと、例えば全角文字の2バイト目を対象に実行した時に、$cに「\」が入ることがあります。

実はファイル名として使えない文字を変換する用に、tkinfo.dllにValidateForFileNameって関数を用意しています。


    call SanitizeFileName $Subject;
    $Subject = $$return;

の所は、

    $Subject = dllfuncstr("ValidateForFileName", $Subject);

のようにするだけで大丈夫なはずです。

そこだけ直して試してみてほしいです。

あと、AIチャットにマクロのことを質問してもうまく答えてくれないんですが、Google Geminiの「Notebook」って所に秀丸エディタや秀丸メールのヘルプファイルを登録したら、そこだとかなり正しい答えを返してくれるようでした。まだテスト中で非公開にしてたんですが、もし良かったらそこで質問するのもやってみてほしいです。

https://notebook.google.com/notebook/e1b3c318-a2d4-4fc0-94be-fe464d1c199b

ただ、今回のマクロを貼り付けして「問題点は?」と質問した場合には、正解は答えてくれないようでした。そこまで賢くは無いようです。
[ ]
RE:00180 添付ファイル保存マクロで文字化けNo.00181
tera-km さん 26/08/25 11:49 [ コメントを投稿する ]
  早速のご返答ありがとうございます

>    $Subject = dllfuncstr("ValidateForFileName", $Subject);
>
>のようにするだけで大丈夫なはずです。

これで解決したようです。

>うでした。まだテスト中で非公開にしてたんですが、もし良かったらそこで質問するのもやってみてほしいです。

情報ありがとうございます。
次から利用してみます。

ありがとうございました。
[ ]

[ 新規に投稿する ]