WEB/システム/IT技術ブログ

smartyでBOM(Byte Order Mark)によるsessionスタート時エラー

smartyを使用した環境でセッション処理を行おうとしたのですが、プログラム「session_start()」のところでエラーとなってしまいました。以下、問題が発生した環境です。

  • PHP : 5.3.0
  • smarty : 2.5.26
  • 文字コード : UTF-8
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at xxxxxxxxxindex.html:1) in xxxxxxxxxindex.php on line 61

テンプレートを読み込み、ページを表示するところは動作しているのですが、どうしても上のエラーがくっついてきます。
いくつか調べているうちに、生成されたhtmlページの1行目の先頭に半角スペースが入っていることが原因だと分かりました。わかりづらいかもしれませんが、以下のように半角スペースがひとつ混入しています。

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

テンプレートでもプログラムでも入力したはずのない半角スペースが出力されてしまう。この原因はどうやら、BOM(Byte Order Mark)というUTF-16などのエンコード方式でファイルの先頭に記入される値のようです。この値はsmartyテンプレートファイルや、PHPプログラムファイルの時点では目には見えないので、おそらく選択して消すことができません。

解決方法としては、BOMが混入している疑いのあるファイルを、秀丸などのテキストエディタを使用して一度shift-jisなどにエンコードして、再度UTF-8にエンコードします。もちろん見た目には変化はありませんが、これでBOMが消えるはずです。

見えない敵なだけに、原因を探るのに時間がかかりました。ところでどこで混入したんだろう。。。

B!

Comment

コメントはありません

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives