はじめに
エンコード「UTF-8」のiniファイルを読み込むプログラムを作成し、開発環境ではいい感じだったのに、本番環境でプログラムを実行したら想定結果が違う...
という現象が発生した。
なにをしたのか
環境移行する際、ファイル転送速度を早くするため、開発環境でiniファイルを圧縮(zip)してから、本番環境にコピーした。プログラム実行時にzipを解凍した。
iniファイルの内容を確認して、保存…。
~~どうやらこの時に**「UTF-8」→「UTF-8 BOM付」**になってしまったらしい。~~
<2019.11.15更新> Windowsの「メモ帳」は文字コードをUTF-8にして保存すると必ずBOM付きになってしまうらしい。 iniファイルを確認した時に不覚にもメモ帳で開き、保存してしまったのだろう…ズバリ UTF-8 BOM付き・BOM無しの違いは先頭の3バイトがあるか無いか
それ以外のファイルの内容や文字コード(符号化方式)については全く同じものです。
つまり、「UTF-8 BOM無し」で作成したiniファイルはBOMなんて考慮していないですから
ファイルの先頭には最初のセクションタイトルを記載していました。
それがファイルを保存したタイミングで「BOM付き」になってしまったので、先頭の3バイトがBOMとして扱われて、プログラムでiniファイルを読み込む時に飛ばされてしまったんですね。
それ故に最初のセクションが読み込めず、気づかぬうちに設定がめちゃくちゃになってしまっていたので、本番環境で動かしたときに想定結果が異なってしまったのです。
「BOM付き」→「BOM無し」に戻す
様々なテキストエディタで設定変更が可能なそうですが、私はサクラエディタを使って設定を直しました。
- サクラエディタでiniファイルを開いて、右下の「UTF-8 BOM付」をダブルクリック
- 「BOM」の[✓]を外す
- 保存する
以上。この手順を行なってからプログラムを実行したら、正常に終了できました!
メモ帳使用時の注意
Windowsの「メモ帳」は文字コードをUTF-8にして保存すると必ずBOM付きになってしまうらしいです。うっかりBOM無しのファイルを「メモ帳」で編集して上書き保存してしまうとBOM情報が書き換えられてしまうので注意が必要です!
普段Windowsのメモ帳をつかう癖が無かったので今まで気にしていなかったが
何気なくメモ帳で開いてしまったんですね…。これが原因だったのか…。