ปัญหาของคำสั่ง header บนไฟล์ประเภท UTF-8 BOM


หน้าแรก PHP MySQL เกร็ดความรู้ ปัญหาของคำสั่ง header บนไฟล์ประเภท UTF-8 BOM
เวลาเขียนเว็บด้วย php ผมชอบใช้ Dreamweaver แต่ก็มีบ้างที่ใช้ Opensource ตัวอื่นๆ เช่น Notepad++ 
ไฟล์ที่สร้างขึ้นมาทั้งหมดผมจะกำหนดให้เป็น utf-8 เสมอ แต่ก็อาจเจอปัญหาแปลกๆได้บ้าง เช่นปัญหานี้
  
ปัญหาที่ว่าคือ
Warning: Cannot modify header information - headers already sent by
ซึ่งโดยปกติ ปัญหานี้จะเกิดจากการที่มีการส่งหรือสั่งให้แสดงข้อความใดๆออกไปก่อนที่จะเรียกใช้คำสั่ง header แต่คราวนี้คำสั่งของผมมีแค่ 1 บรรทัดเท่านั้น
17-9-2552_10-31-59
หลังจากระดมสมองของ Admin มาช่วยกันหาคำตอบ จึงได้พบความจริงเกี่ยวกับเรื่องนี้ จำเลยของคดีคือ BOM ครับ
BOM คืออะไร
     BOM หรือ Byte Order Mark คือ signature แบบหนึ่งที่ใช้ระบุชนิดของ Endianness  มีการใช้ในไฟล์ที่มีการเข้ารหัสข้อมูลแบบ UTF-16 หรือ UTF-32 ซึ่งมีการใช้ Byte 2 หรือ 4 byte ในการเก็บอักขระ 1 ตัว และมีการเรียงลำดับ Byte ที่ต่างกัน คือ little-endian และ big-endian ในขณะที่ไฟล์ที่เข้ารหัสข้อมูลแบบ UTF-8 ใช้ byte 1 byte ในการเก็บอักขระ 1 ตัว จึงไม่จำเป็นต้องใส่ BOM เข้าไป (ใส่ได้ไม่ผิดและมีบาง editor ที่ใส่ให้ครับ)

ถ้าไฟล์ไหนมีการใส่ BOM จะมีอักขระ เหล่านี้ใส่ไว้ที่ต้นไฟล์ 
BytesEncoding Form
00 00 FE FFUTF-32, big-endian
FF FE 00 00UTF-32, little-endian
FE FFUTF-16, big-endian
FF FEUTF-16, little-endian
EF BB BFUTF-8

NameUTF-8UTF-16UTF-16BEUTF-16LEUTF-32UTF-32BEUTF-32LE
Smallest code point0000000000000000000000000000
Largest code point10FFFF10FFFF10FFFF10FFFF10FFFF10FFFF10FFFF
Code unit size8 bits16 bits16 bits16 bits32 bits32 bits32 bits
Byte orderN/Abig-endianlittle-endianbig-endianlittle-endian
Minimal bytes/character1222444
Maximal bytes/character4444444

 ถ้าเราใส่ BOM เข้าไป เราอาจมองไม่เห็นชุดอักขระที่เป็น BOM ใน Editor (เพราะใน UTF-8 จะไม่แสดงให้เห็นอักขระใดๆ จะมีเพียงช่องว่างเท่านั้น) วิธีการตรวจสอบง่ายๆคือลองเปลี่ยน Page Encoding ที่ตัว Browser เป็น Latin หรือ ISO-8859-1 
17-9-2552_11-20-44
ก็จะได้เจอหน้าผู้ร้ายตัวจริงของงานนี้
17-9-2552_11-08-45
เมื่อรู้สาเหตุก็ลองตามไปแก้่ครับ โดยการกำหนดในส่วนของ Encoding ของ Page นั้น
17-9-2552_10-14-41
เอาเครื่องหมายถูกในกรอบสีแดงออก แล้ว Apply ครับ แค่นี้ก็สามารถจัดการปัญหานี้ได้แล้ว
 

refer: http://fradius.coe.psu.ac.th/content/view/132/1/


ขึ้นไปด้านบน