秀丸の設定に則った外部ファイルのエンコード判定 (秀丸エディタ 8.90以降)

概要

秀丸が対象の外部テキストを「これから」初めて「あなたの秀丸エディタ」で読み込んだと仮定すると、
秀丸は、対象のファイルをどのエンコードと判断するだろうか、その結果を取得する関数です。

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

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

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

秀丸でファイルのエンコードを取得する(秀丸に設定されている内容に従う)

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

decltype(Hm.File)::IEncoding Hm.File.getEncoding(wstring filepath)

この返り値IEncoding型 には「getMsCodePage()」と「getHmEncode()」がメソッドとして存在します。
getHmEncode()では、秀丸マクロの「encode」の解説書 の「encode」の項目に対応する値が取得できます(※)。
getMsCodePage()には、秀丸の独自の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以降)
    
  • C++側のソース

    dllmain.cpp
    #include "HmCppInvoke.h"
    
    using namespace Hidemaru;
    using namespace std;
    
    extern "C" __declspec(dllexport) THmNumber test() {
    	Hm.funcDllExport();
    
    	try
    	{
    		wstring target_filepath = L"D:\\test\\test.txt";
    
    		// getEncoding() で、「getHmEncode()」と「getMsCodePage()」をメソッドとして持つオブジェクトが返ってくる。
    		auto encoding = Hm.File.getEncoding(target_filepath);
    
    		Hm.OutputPane.output(to_wstring(encoding.getHmEncode()) + L"\r\n");
    		Hm.OutputPane.output(to_wstring(encoding.getMsCodePage()) + L"\r\n");
    	}
    	catch (exception ex)
    	{
    		Hm.OutputPane.output( L"エラーが発生:" + Text::Encoding::utf8_to_utf16( ex.what() ) );
    	}
    	return 1;
    }
    
  • 対象のパスにファイルを置いたり、ファイル名を変更したり、ファイルのエンコードを変更するなどして、
    いろいろと挙動を確認してみましょう。

    特に、「その他」⇒「動作環境」⇒「ファイル」⇒「エンコード1」 で判定対象となっていないエンコードの場合に、
    強引にどれかに秀丸が当てはめようとしてしまうため、判定ミスが発生します。

    よって、この関数が使えるには、「対象のディレクトリには、自分自身が使っている秀丸なら一発でエンコードが正しく判断可能」でありという
    「そういったファイル群に対してのみ自動で振り分けて処理をする」といった限られたシーンで利用することとなるでしょう。