hmRbが持つ特別な関数一覧 その④

秀丸が対象の外部テキストを「これから」初めて「あなたの秀丸エディタ」で読み込んだと仮定すると、どのエンコードと判断するかの関数(秀丸エディタ v8.90以上)

ポイントは「初めて」と「あなたの秀丸エディタ」の設定で読み込んだ場合、ということになります。
どのPCでも同じとなる汎用的な結果が返ってくる機能ではありません。

設定は、秀丸より「その他」⇒「動作環境」⇒「ファイル」⇒「エンコード1」で主に設定されています。
この優先順位にしたがって判定され、また、チェックが付いていないエンコード値は、この関数では「取り扱わないもの」とされます。
PICTURE

このように、あくまでも「あなたの秀丸エディタの設定」と一致したエンコード情報が欲しい場合に、この機能を利用します。

  • $hm.File.GetEncodling( ファイルパスの文字列 )

    この返り値のオブジェクト(IEncoding型)には「MsCodePage」と「HmEncode」がプロパティとして存在します。
    HmEncode は秀丸マクロの「encode」の解説書 の「encode」の項目のです。
    MsCodePageには、秀丸の独自のencode値を、Windows上での「コードページ」の番号へと置き換えたものです。

    秀丸マクロのencodeの値。
    ----------------------------
    0  新規作成直後
    1  Shift-JIS
    2  Unicode(UTF-16)
    3  EUC
    4  JIS
    5  UTF-7
    6  UTF-8
    7  Unicode (UTF-16,Big-Endian)
    8  欧文
    9  簡体字中国語
    10 繁体字中国語
    11 韓国語
    12 韓国語(Johab)
    13 中央ヨーロッパ言語
    14 バルト語
    15 ギリシャ語
    16 キリル言語
    17 シンボル
    18 トルコ語
    19 ヘブライ語
    20 アラビア語
    21 タイ語
    22 ベトナム語
    23 Macintosh
    24 OEM/DOS
    25 その他
    26 バイナリモード
    27 Unicode(UTF-32) (V8.00以降)
    28 Unicode(UTF-32,Big-Endian) (V8.00以降)
    
    #PY = loaddll( hidemarudir + @"\hmRb.dll" );
    
    #_ = dllfuncw( #PY, "DoString", R"PY(
    require 'mscorlib'
    
    begin
        c = $hm.File.GetEncoding("D:\\test\\test.txt")
        $hm.debuginfo(c.HmEncode);
        $hm.debuginfo(c.MsCodePage);
    
        # MsCodePage から、.NET Framework上のencodeオブジェクトを取得して、
        #.NET Frameworkの読み取り機能を使ってテキストを取得する例
        ms_enc = System::Text::Encoding::GetEncoding( c.MsCodePage )
        text = System::IO::File.ReadAllText("D:\\test\\test.txt", ms_enc)
        $hm.debuginfo(enc);
        $hm.debuginfo(text);
    
    rescue => e
        $hm.debuginfo(e);
    end
    
    )PY");
        
        
    freedll( #PY );
    
  • $hm.File.ReadAllText( ファイルパスの文字列, 指定の秀丸のencode )

    上述では.NET Frameworkに用意されている機能を利用しましたが、
    秀丸本体から提供されているAPIを経由させることも可能です
    特にマイナーなエンコードにおいて、秀丸のファイル読み取り結果と確実に一致する可能性が高まります。

    #PY = loaddll( hidemarudir + @"\hmRb.dll" );
    
    #_ = dllfuncw( #PY, "DoString", R"PY(
    require 'mscorlib'
    
    begin
        text = $hm.File.ReadAllText("D:\\test\\test.txt") # encode の指定が無い場合、内部的に $hm.File.GetEncoding(...) 相当を実行して、その結果でファイルを読み込み。
        $hm.debuginfo(text);
    rescue => e
        $hm.debuginfo(e);
    end
    
    begin
        text = $hm.File.ReadAllText("D:\\test\\test.txt", 6) # 例えば「6」と指定することで、「utf8エンコード」で、強制指定して読み込み(番号と文字コードの対応は、上述の encode の一覧表を参照のこと)
        $hm.debuginfo(text);
    rescue => e
        $hm.debuginfo(e);
    end
    
    )PY");
        
        
    freedll( #PY );