UTF-8 BOM無し/BOM有り
所沢でホームページ制作や欧州輸入品の販売などを行っているRishunTradingです。
前回は、本番環境(サーバー)と開発環境(ローカル)で、処理の目的は一緒でも実装上どうしても相違してしまう場合に、本番環境(サーバー)か、それとも開発環境(ローカル)かを、if文で分岐させる方法について紹介させて頂きました。
今回も、それに似た話ではあるのですが、サーバー環境と、ローカル環境で外部ファイルを扱う場合には、文字コード(UTF-8)、その中でもBOM有り/BOM無しを意識する必要がありますので、今回は、そのお話について記載しようと思います。
UTF-8のBOM付き、BOM無しとは
文字コードの一種であるUnicodeには、BOM付き、BOM無しの2種類があります。BOMは、Byte order markの略で、Unicodeで符号化されたテキストの先頭に付与される数バイトのデータの事です。
サーバーで扱う際には、「BOM無し」でないと、PHPのプログラムが正常に扱う事ができない場合があります。
そのため、サーバーで扱うには「BOM無し」のファイルである必要があります。
ややこしいのが、「Windows」。
「Windows」でテキストファイルと言えば、「シフトJIS」形式が大半でしたが、昨今では「UTF-8」形式のテキストファイルも普通になり、UTF-8が主流になりつつあります。
しかし、「Windows」で、UTF-8(BOM無し)のファイルを扱うと、弊害として「Windows Search」がうまく動作しないことがあります。「Windows Search」とは、エクスプローラーの検索欄などで使用されたりする便利なファイルの全文検索機能の事です。
なぜかというと、「Windows Search」は、「ファイルの先頭に付与されるBOM」を認識して正確にインデックス化を行う事で、この「Windows Search」のファイル全文検索機能を実現しています。
(正確に言うと、「BOM無しのUTF-8」でも、インデックス化されますが、ASCIIコードのみ全文検索が可能で、日本語などの非ASCII文字が、全文検索できない形になります。日本語も含めた全文検索を可能にするためには、BOM有りのUTF-8である必要があるわけです。)
そのため、恐らく「Windows」としては、「Windows Search」の(日本語などの非ASCII文字も含めた)全文検索機能を扱えるようにしたいのでしょう、Windows上のソフトウェアでUTF-8(BOM無し)のファイルを扱って保存すると、必然的に、「BOM付き」でファイルが保存されてしまいます。
(後で記載しますが、例外としてメモ帳は、UTF-8(BOMなし)での保存が可能になりました。)
一方で前段で記載した通り、「BOM付きのUTF-8」のファイルは、サーバー上では、PHPのプログラムが正常に扱う事ができない場合があります。
例えば、CSVファイルのインポート処理を実装したような場合、CSVファイルを「Excel」などで編集し保存すると、BOM付きのUTF-8のファイルとなるため、このままのインポート処理でCSVファイルを読み込ませてしまうと、インポート処理が正常に動作しない可能性があります。
WindowsでBOM無しUTF-8ファイルの作り方
Windowsのメモ帳は、UTF-8(BOM無し)での保存が可能です。そのため、ExcelなどでCSVファイルを編集した後、メモ帳で再度開き直し、保存し直せば、UTF-8(BOM無し)で保存されます。
前段の例で挙げた、インポート処理などでは、本ファイル(UTF-8 BOM無し)を扱う事で正常に扱う事ができます。
または、VisualStdio Codeのバイナリモードを使って先頭のBOMを手作業で削除しても大丈夫です。
プログラムでBOM無しUTF-8にする方法
①サーバーの場合
LinuxのnkfコマンドでBOMを削除できます。
1 | nkf --overwrite --oc=UTF-8 (ファイル名) |
そのため、サーバーでは、プログラム内から以下のようにコマンドを呼び出せば、BOMを削除する事ができます。
1 2 3 | //$filepath 変換元ファイルパス system('nkf --overwrite --oc=UTF-8 '. $filepath); //※上書きされます。 |
②Windowsの場合
Windowsの場合は、PowerShellを使って以下のようなバッチファイルを作成し、呼び出す処理をプログラム内に埋め込めば、BOMを削除する事ができます。
change-utf8.bat
1 2 3 4 5 6 7 8 9 | @echo off :BOM UTF-8 -> UTF-8 setlocal enabledelayedexpansion for %%f in (%*) do ( echo %%~ff| findstr /l /e /i ".txt .csv" if !ERRORLEVEL! equ 0 ( powershell -nop -c "&{[IO.File]::WriteAllText($args[1], [IO.File]::ReadAllText($args[0]))}" \"%%~ff\" \"%%~ff\" ) ) |
プログラム内から呼び出す
1 2 3 | //$filepath 変換元ファイルパス //export.log 結果ログ出力 $batfile = dirname(__FILE__) . "change-utf8.bat ". $filepath." >> export.log" |
前段の例で挙げたインポート処理であれば、読込処理を開始する前にこれらを実装すれば、BOM無しUTF-8で扱う事が出来ます。
以上、皆さまのお役に立てれば幸いです。
- タグ
- プログラミング
WEB DESIGN全てお任せ!ホームページ制作
RishunTradingでは、日本にはないコンセプトや高いデザイン性をもったヨーロッパ製品の輸入販売、及び、Webサイト制作事業などをおこなっております。
「全てお任せ!ホームページ制作」は、ドメイン取得からサーバー設定、レスポンシブルデザイン(スマホ、タブレット対応)、SEO対策がすべて含まれたお得なホームページを制作するサービス商品です。
運用開始後に「Webサイト運用管理サービス(保守)」と組み合わせて購入しますと、メンテナンス、更新も含めてすべて弊社で実施しますので、お客様は安心して本業に集中する事ができます。
しかもなんと、「全てお任せ!ホームページ制作」は、¥100,000!で提供しております。
本業が忙しい中小企業様に大変ご好評を頂いている商品です。
独自ドメイン取得
サーバー開設&設定
レイアウト設計
レスポンシブルデザイン
(*1)検索エンジン最適化
(SEO対策)場所Maps
お問い合わせフォーム
SSL化
各種SNS連携
運用マニュアル