ファイル BOM 情報確認

2021/05/18 06:06 Macro::macro サンプル

ファイルの BOM 情報確認マクロ

このサンプルマクロは、以下の仕様を満たすものとします。

マクロの目的

対象ファイルの BOM (Byte Order mark) を確認します。

出力されるダイアログボックスの数値の意味は、以下の通りです。
<result>の値値の意味
-1対象 BOM は UTF-8 のはずだが情報が不正。
0対象に BOM はなかった。
1対象 BOM は UTF-8 を示している。
2対象 BOM は UTF-16 Big Endian を示している。
3対象 BOM は UTF-16 Little Endian を示している。

利用可能環境

Teraterm
依存する Tera Term バージョン:Tera Term 4.69 以降*1

利用する Tera Term コマンド:
種別:制御Ver機能の簡易説明
callサブルーチンをコールする。
endマクロの実行そのものを終了する。
if,then,elseif,else,endif条件分岐
returnサブルーチンを抜け、メインルーチンへ戻る。
種別:文字列操作Ver機能の簡易説明
str2code文字列を ASCII コード値に変換する。
str2int文字列を整数値に変換する。
種別:ファイル操作Ver機能の簡易説明
filecloseファイルハンドルを閉じる。
fileopenファイルを開く。
fileread4.48以降ファイルを読む。
filesearchファイルまたはフォルダがあるか確かめる。
foldersearch4.69以降フォルダがあるか確かめる。
種別:その他Ver機能の簡易説明
inputbox文字列を入力するためのダイアログボックスを開く。
4.53以降デフォルト入力文字を設定するオプションの追加。
4.54以降特殊文字の解釈を制御するオプションの追加。
messageboxダイアログボックスを開き、ユーザーにメッセージを知らせる。
4.54以降特殊文字の解釈を制御するオプションの追加。
4.60以降キャンセル時にマクロ停止を確認する機能の追加。
※ 関係演算子 "==" は、Tera Term バージョン 4.54 以降で利用可能になっています。

マクロの使い方

Windows へ拡張子 .ttl を ttpmacro.exe へ関連付けし、実行します。
タイミング
任意のタイミングで実行が可能です。
指定方法
マクロ実行時に出力される入力ダイアログボックスへ BOM 情報を確認したいファイル名を、相対パスもしくは絶対パスで入力のうえ、OK ボタンをクリックしてください。

*1 : 保存する文字コードによっては Tera Term バージョン 4.102 以降

コード

著作権情報

このサンプルマクロに関する著作権は、当サイト管理者が所有しています。
著作権者
神場 和也
ライセンス
3条項BSDライセンス
関連情報
(なし)

サンプルコード

ファイルダウンロード
ckbom.zip

※ 解凍してご利用ください。
項目内容
文字コードShift JIS
実行確認バージョンTera Term Ver 4.102
備考下記コピペ用ソースコードをファイルに保存したものです。
コピペ用
以下のソースコードをファイルに保存のうえご利用ください。

※ UTF-8 で保存した場合は、Tera Term Ver 4.102 以降で実行する必要があります。詳細は マクロファイルの仕様 を参照してください。

・対象ファイルの BOM (Byte Order mark) を確認するマクロ
想定ファイル名:ckbom.ttl
; 対象ファイルの BOM (Byte Order mark) を確認する
;
; File: ckbom.ttl
; Description: BOM check.
; Environment: generic
; Update: 2019/7/7
; Author: Kazuya Jimba

;;; 変数設定 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 対象ファイルのデフォルト設定
defaultfile = 'dummy.txt'

; 符号化方式の確認用変数設定

; 符号化方式   バイトオーダーマーク
; UTF-8      = 0xEF 0xBB 0xBF	; Tera Term: 15711167
; UTF-16     = 0xFE 0xFF	; Tera Term: 65279
; UTF-16     = 0xFF 0xFE	; Tera Term: 65534

; UTF-8 BOM 整数値 (3byte)
str2int utf8bomc1 '0xEF'	; 239
str2int utf8bomc2 '0xBB'	; 187
str2int utf8bomc3 '0xBF'	; 191

utf8bom2byte = utf8bomc1 * 256 + utf8bomc2
utf8bom3byte = utf8bomc1 * 256 * 256 + utf8bomc2 * 256 + utf8bomc3

; UTF-16 BOM 整数値 (2byte)
str2int UTF16bomcA '0xFE'	; 254
str2int UTF16bomcB '0xFF'	; 255

; UTF-16 Big endian (上位バイトから順番にメモリに並べる方式)
utf16BigEn    = UTF16bomcA * 256 + UTF16bomcB

; UTF-16 Little endian (下位バイトからさかさまにメモリに並べる方式)
utf16LittleEn = UTF16bomcB * 256 + UTF16bomcA

;;; メイン処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

message = "BOM を確認したいファイル名を入力してください。"
title   = "ファイル名入力"

inputbox message title defaultfile
targetname = inputstr

; サブルーチンのコール
;call chkfile
call CheckBOM

messagebox result 'result'

;;; 終了処理 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; マクロの終了
end

;;; サブルーチン ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

:chkfile
; 変数 targetname 内の文字列がファイルかフォルダかを判定するサブルーチン
; result
; 0 = 対象は存在しなかった。
; 1 = 対象はフォルダだった。
; 2 = 対象はファイルだった。

filesearch targetname
if result = 1 then
    ; 対象が存在する場合

    ; フォルダであるか確認する
    foldersearch targetname 
    if result = 1 then
        ; フォルダの場合 (存在する対象がフォルダである)
        result = 1

    else
        ; ファイルの場合 (存在するがフォルダではない)
        result = 2
    endif

else
    ; 対象が存在しない場合
    result = 0

endif

return

:CheckBOM
; ファイル targetname 先頭バイト文字列が BOM かどうかを判定するサブルーチン
; result
; -1 = 対象 BOM は UTF-8 のはずだが情報が不正。
;  0 = 対象に BOM はなかった。
;  1 = 対象 BOM は UTF-8 を示している。
;  2 = 対象 BOM は UTF-16 Big Endian を示している。
;  3 = 対象 BOM は UTF-16 Little Endian を示している。

; 対象ファイルの有無を確認
call chkfile

; 対象が存在する場合に BOM を確認
if result = 2 then
    ; 上位 2 byte を取得
    fileopen fhandle targetname 0
    fileread fhandle 2 data
    fileclose fhandle

    ; 上位 2 byte を整数値へ変換
    str2code _2byte data

    ; 上位 2 byte の整数値を比較
    if _2byte == utf8bom2byte then
        ; 上位 3 byte を取得
        fileopen fhandle targetname 0
        fileread fhandle 3 data
        fileclose fhandle

        ; 上位 3 byte を整数値へ変換
        str2code _3byte data

        if _3byte == utf8bom3byte then
            result = 1
        else
            result = -1
        endif
    elseif _2byte == utf16BigEn then
        result = 2
    elseif _2byte == utf16LittleEn then
        result = 3
    else
        result = 0
    endif
endif

return

備考

特にありません。