秀丸の設定に則って外部ファイルを読み込む (秀丸エディタ 8.90以降)

概要

前節では、秀丸の機能を使って外部ファイルのエンコードを判定しましました。
このエンコード判定を自動で行いながらファイルを読み込むという秀丸から提供されている関数を利用したメソッドも提供しています。

このように、あくまでも「あなたの秀丸エディタの設定」と一致したテキスト読み込み結果が欲しい場合に、このメソッドを利用します。

秀丸でファイルのエンコードを判断し(この時、秀丸に設定されている内容に依存する)、
その判断結果に基づいて、ファイルのテキスト内容を取得する。

マクロ中でもマクロ中以外でも、常時取得することが出来ます。

decltype(Hm.File)::IHidemaruStreamReader Hm.File.Open( String filepath, [int hm_encode] )
  • IHidemaruStreamReader

    class IHidemaruStreamReader
    {
        IEncoding getEncoding();
        wstring getFilePath();
        void close();
        wstring read();
    }
    
    

    となっています。

  • C++側のソース

    dllmain.cpp
    #include "HmCppInvoke.h"
    #include "HmCppInvokeConvertString.h"
    
    using namespace Hidemaru;
    using namespace std;
    
    extern "C" __declspec(dllexport) THmNumber test() {
        Hm.funcDllExport();
    
        try
        {
            auto target_filepath = L"D:\\test\\test.txt";
    
            // Open関数を利用することで、IHidemaruStreamReader型のインターフェイスを持ったオブジェクトが返ってくる。
            // IHidemaruStreamReader は「getEncoding()」「getFilePath()」のプロパティと、「read()」「close()」のメソッドを持つ。
            auto sr = Hm.File.open(target_filepath);
    
            Hm.OutputPane.output(sr.getFilePath());
    
            // 「getEncoding()」で返ってくるIEncodingオブジェクトには、「getHmEncode()」と「getMsCodePage()」をプロパティとして持つオブジェクトが返ってくる。
            auto encoding = sr.getEncoding();
            Hm.OutputPane.output(L"HmEncode:" + to_wstring(encoding.getHmEncode()) + L"\r\n");
            Hm.OutputPane.output(L"MsCodePage:" + to_wstring(encoding.getMsCodePage()) + L"\r\n");
    
            auto text = sr.read();
            Hm.OutputPane.output(text);
    
            // ここでは明示的にクローズしているが、クローズし忘れても、sr が解放されれば、そのうち解放される。
            // リソースのハンドルが残り続けるといったことはない。
            sr.close();
        }
        catch (exception ex)
        {
            Hm.OutputPane.output(L"エラーが発生:" + Text::Encoding::utf8_to_utf16(ex.what()));
        }
        return 1;
    }
  • ファイルコードの指定

    秀丸の自動エンコード判定では、失敗する時、あるいは、事前にエンコードが決め打たれている場合には、
    エンコードを指定することが出来ます。

    dllmain.cpp
    #include "HmCppInvoke.h"
    #include "HmCppInvokeConvertString.h"
    
    using namespace Hidemaru;
    using namespace std;
    
    extern "C" __declspec(dllexport) THmNumber test() {
        Hm.funcDllExport();
    
        try
        {
            auto target_filepath = L"D:\\test\\test.txt";
    
            // 強制的に 秀丸の「encode」を指定上書きすることが可能。
            // 例えば、「3」とは「EUC-JP」で、強制決め打ちして読み込み(前節の encode の一覧表を参照)。
    // 自動だと間違ってしまう場合に指定するのが良い。 auto sr = Hm.File.open(target_filepath, 3); Hm.OutputPane.output(sr.getFilePath()); // 「getEncoding()」で返ってくるIEncodingオブジェクトには、「getHmEncode()」と「getMsCodePage()」をプロパティとして持つオブジェクトが返ってくる。 auto encoding = sr.getEncoding(); Hm.OutputPane.output(L"HmEncode:" + to_wstring(encoding.getHmEncode()) + L"\r\n"); Hm.OutputPane.output(L"MsCodePage:" + to_wstring(encoding.getMsCodePage()) + L"\r\n"); auto text = sr.read(); Hm.OutputPane.output(text); // ここでは明示的にクローズしているが、クローズし忘れても、sr が解放されれば、そのうち解放される。 // リソースのハンドルが残り続けるといったことはない。 sr.close(); } catch (exception ex) { Hm.OutputPane.output(L"エラーが発生:" + Text::Encoding::utf8_to_utf16(ex.what())); } return 1; }
  • 対象のパスにファイルを置いたり、ファイル名を変更したり、ファイルのエンコードを変更するなどして、
    いろいろと挙動を確認してみましょう。