การสร้างเว็บเพจแบบ 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
ต่อมาก็ถึงคำถามที่ว่า หน้าตามันเป็นยังไง ผมได้สร้างไฟล์ 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+
Louiskung says:
18/11/2552 at 18/11/2552
เป็นปัญหาจริงๆด้วยครับ งง อยู่ตั้งนานว่ามันเกี่ยวไรกับ BOM หรือ ไม่BOM
ขอบคุณครับ
Thongluk Jan says:
31/10/2555 at 31/10/2555
ขอบคุณสำหรับความรู้ เป็นปัญหาที่น่ารำคาญใจมาก แต่ BOM มันมีประโยชน์อะไร มันเกิดมาเพื่อใคร อันนี้ยังไม่รู้
akarat says:
19/03/2557 at 19/03/2557
ขอบคุณมากครับ งม อยู่ 2 วัน อิอิ