การสร้างเว็บเพจแบบ utf-8 จะมีอยู่ 2 ลักษณะ คือ utf-8 without BOM กับ utf-8 with BOM ซึ่ง utf-8 with BOM นี่แหละที่มักจะก่อปัญหา error ดังด้านล่าง error อันสุดแสนจะคลาสสิค ถ้าลองได้เขียน utf-8 ใหม่ๆ แล้วเป็นอันว่าได้เจอกันแทบทุกคน

 

Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent

 

ลองอ่านบทความที่ท่านอื่นได้รับผลกระทบจาก BOM กัน

1. http://www.wittaya.net/2009/02/byte-order-mark-bom.html

2.PHP ไม่ support BOM (utf-8 with BOM)

 

แล้วทีนี้มาถึงคำถามที่ว่า แล้วไอ้ BOM มันคืออะไร ผมลองหาในกูเกิลดู มันมีแต่ภาษาอังกฤษที่เขา อธิบายไว้ค่อนข้างเป็นหลักการและชัดเจน

1.http://en.wikipedia.org/wiki/Byte-order_mark

2.What is a BOM?

 

ต่อมาก็ถึงคำถามที่ว่า หน้าตามันเป็นยังไง  ผมได้สร้างไฟล์ php ขึ้นมาตัวหนึ่ง แล้วก็เซฟเป็น utf-8 without BOM กับ utf-8 with BOM  แล้วก็ดาวน์โหลดโปรแกรม Hex Editor Neo มาเพื่อเปิดดูไฟล์ในโหมด binary เพื่อให้เห็นหน้าตา BOM กันอย่างชัดๆ

 

นี่เป็นโค้ดที่ผมเขียน สังเกตดูนะครับ ตรงบรรทัดแรก จะไม่มีอะไรอยู่ก่อนเครื่องหมาย <?php เลย

ทีนี้มาดูกันต่อ

 

utf-8 without BOM

 

utf-8 with BOM โอ้ว… จะเห็นว่ามีตัวอะไรไม่รู้แทรกอยู่ก่อน <?php

 

ตัวนี้แหละครับที่มันจะเป็น output ก่อนใครๆ และเมื่อเจอกับคำสั่ง header(); ละก้อ error อันสุดแสนจะแคลสสิก ก็จะปรากฎทันที ทั้งที่ถ้าเราเปิดดูโค้ดด้วย edit+ หรือ dreamweaver เราจะไม่เห็นมันเลย

 

เพราะฉะนั้นสรุป

ถ้าใช้ดรีมเว็บเวอร์

 

ถ้าใช้ Edit+