4D-jp 4D Japan Technical Support Team

BOM付きファイル

2024-12-10

4DはBOMが設定できる文字セット(例:UTF-8)でファイルを生成するとき、必要に応じてBOM(Byte Order Mark)を付けます。 ただし、例外もあります。

説明

4DはBOMが設定できる文字セット(例:UTF-8)でファイルを生成するとき、必要に応じてBOMを付けます。 BOMをセットしたくないようなときは、文字セット名称に続いて接尾辞-no-bomを付け加える必要があります。 例えば、BOMなしで"UTF-8"でファイルを生成するときには、文字セットとして"UTF-8-no-bom"を渡す必要があります。

しかし、これには例外もあります。

例えば、次のようなコードを実行したとき、それぞれBOM付き、BOM無しになります。

//BOMが付くケース
var $fileObject : 4D.File
$fileObject:=File(Folder(fk desktop folder).path+"test1.csv")  //デスクトップに作成
$fileObject.setText("TEST"; "utf-8")

//BOMが付かないケース
var $fileObject : 4D.File
$fileObject:=File(Folder(fk desktop folder).path+"test2.csv")  //デスクトップに作成
$fileObject.setText(""; "utf-8")

このケースではの2種類のファイル生成コードの違いは、実際にテキストをセットしたかどうかになります。 セットするテキストが無いときは、BOMが付きません。

同様にファイルハンドルを利用して、テキストを追加していくようなケースでもBOMが付くことはありません。 そのようなBOMが付かないケースでは、自力でBOMga付くようにコーディングする必要があります。

例えば、次のコードは必要な行数分ループしてCSVファイルを生成しますが、BOMを自力で先頭に付けています。

/*
	4D 19R7以降で動作
*/
//mark: ファイルオブジェクトの準備
var $csv : 4D.File
$csv:=File(Folder(fk desktop folder).path+"test.csv")  //デスクトップに作成
If ($csv.exists)
	$csv.delete()  //既に存在するときは削除
End if 
//mark: 自力でUTF-8用のBOMを用意
SET BLOB SIZE($BOM; 3)
$BOM{0}:=0x00EF
$BOM{1}:=0x00BB
$BOM{2}:=0x00BF
$csv.setContent($BOM)  //BOMを書き込み
//mark: 追加書き込みの準備
$options:=New object
$options.mode:="append"  //追加書き込み
$options.charset:="UTF-8"  //UTF-8の場合は指定しなくても良い
$options.breakModeWrite:="crlf"  //改行はCR/LFにする
$f:=$csv.open($options)  //追加書き込みでファイルハンドルを生成
//mark: 行を追加書き込みする
For ($i; 1; 10)
	$text:="カラム1番め\tカラム2番め\tカラム3番め"  //1行分のテキスト(改行コードは不要)
	$f.writeLine($text)  //テキストの書き込み(改行コードはここで自動で付加される)
End for