質問
2022年5月6日金曜日 0:29
表記のとおり、
テキストファイルの文字コードがUTF-8の時に
『UTF-8』なのか、『UTF-8(BOM付き)』なのかを判定したいです。
https://replication.hatenablog.com/entry/20080229/1204386249
に参考になるコードがあり、見よう見まねで
後記コードとしてみましたが
変数a,b,cともNullになってしまうらしく、
『UTF-8(BOM付き)』のファイルでもfalseが返ってきてしまいます。
どのようなコードにすればいいでしょうか?
Public Function isBom(filePath As String) As Boolean
Dim Data
isBom = False
With CreateObject("ADODB.Stream")
.Open
.Type = 1
.LoadFromFile filePath
Data = .Read
.Close
End With
Dim a: Hex (AscB(MidB(Data, 1, 1)))
Dim b: Hex (AscB(MidB(Data, 2, 1)))
Dim c: Hex (AscB(MidB(Data, 3, 1)))
If (a = "FE" And b = "FF") Or _
(a = "FF" And b = "FE") Then
isBom = True 'UTF-16のBOMあり
End If
If a = "EF" And b = "BB" And c = "BF" Then
isBom = True 'UTF-8のBOMあり
End If
End Function
なお、環境は Windows10、Office2019です。
すべての返信 (2)
2022年5月6日金曜日 1:26 ✅回答済み
Dim a: Hex (AscB(MidB(Data, 1, 1)))
Dim b: Hex (AscB(MidB(Data, 2, 1)))
Dim c: Hex (AscB(MidB(Data, 3, 1)))
コロン(:)を使うのは、2行以上の内容を1行にまとめて書いてしまう方法です。
つまり
Dim a
Hex (AscB(MidB(Data, 1, 1)))
Dim b
Hex (AscB(MidB(Data, 2, 1)))
Dim c
Hex (AscB(MidB(Data, 3, 1)))
と同じ意味になります。
つまり上記のコードではHexの結果は変数a,b,cに代入されていないことになりNothingになります。
ですから、代入をするように修正する必要があります
Dim a
a = Hex(AscB(MidB(Data, 1, 1)))
Dim b
b = Hex(AscB(MidB(Data, 2, 1)))
Dim c
c = Hex(AscB(MidB(Data, 3, 1)))
あるいは1行にまとめたい場合なら
Dim a: a = Hex(AscB(MidB(Data, 1, 1)))
Dim b: b = Hex(AscB(MidB(Data, 2, 1)))
Dim c: c = Hex(AscB(MidB(Data, 3, 1)))
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
2022年5月6日金曜日 1:35
ありがとうございます。
期待通り動作しました。
今後もよろしくお願いいたします。