FileMakerからCP932の出力

ソケット通信用の固定長のデータをfileMakerで出力する目的でShift-JISで文字を外部テキストファイルとして生成する必要がある。ただし、オリジナルデータは基幹システム上にあってCP932で送付され、ミドルウェアでCP932 -> UTF-8 となっている。

とくに人名に含まれる「﨑」「彅」「髙」などの拡張文字がはいると、Shift-JISに変換するときにまったく出力できないという問題があった。

これまで、最後に改行を含まないデータを出力する場合、BaseElemntプラグインを使用し、BE_SetTextEncoding ()でshift-jisにしていた。これをCP932に設定しても動作せずオーバーヘッドを無視するなら、別にインストールしたiconvを使い、UTF-8で出力したファイルをCP932に変換するなど行う必要があった。

ファイルメーカー標準のフィールドのエキスポートには、文字コード設定がなく無理と決めつけていたが、オンラインのFileMaker勉強会で質問したところ、FileMaker 16から使えるTextEncode()を使うと良いのでは無いかと指摘された。

具体的にはグローバルオブジェクトフィールドにTextEncode($text,”shift_jis”,4)として一旦作成し、これをフィールドのエキスポートを使って出力し、上記の文字が問題なく変換されていることを確認した。ただし、変換できない文字は半角スペースになることから、正確にバイト長を合わせなければならない、固定バイト長ソケット電文を作成するには問題があった。

そこでさらに、JIS変換後に何バイトになるのかわかるカスタム関数を

GetContainerAttribute ( TextEncode ( w ; “shift_jis” ; 4 ) ; “fileSize” )

として用意して固定バイト長が破綻しないようにできた。非常に有用な知見であった。