บทความ

กำลังแสดงโพสต์จาก ตุลาคม, 2011

substr กับ utf8 แล้วเป็นสี่เหลี่ยม

วันนี้เจอปัญหา หรือจะเรียกว่าเรื่องท้าทายความคิดดี ผมจำเป็นต้องนำข้อมูลจาก dbf ไปแสดงผลในเว็บผ่านภาษา php ซึ่งมันต้องตัดข้อความที่ค้นหาให้สั้นลงด้วย function substr() ไอ้ที่ตัดน่ะมันก็ได้อยู่ครับ แต่ตัดแล้วได้ผลลัพธ์ที่อ่านออกมั่งไม่ออกมั่งเป็นสี่เหลี่ยมๆ ว้า..า แล้วทีนี้จะแก้กันยังไงลองอ่านดูครับ  จะแก้ได้ต้องหาที่มาของปัญหาก่อน เมื่อผมเขียนชุดคำสั่ง php ให้อ่านค่าฐานข้อมูลที่ encode ด้วยรหัส UTF-8 ออกมา ผลก็ปกติดี แต่เนื่องจากมันยาวเกินไป ผมเลยใช้ฟังก์ชั่น substr() ตัดแบ่ง ผลก็คือ มันเป็นรหัสภาษาที่เพี้ยนๆ บางตัวอ่านได้แต่บางตัวเป็น อักษรสี่เหลี่ยม ก็เลยค้นหาวิธีแก้และที่มาของปัญหาอยู่สักพัก แล้วก็พบว่า ปัญหานี้จะไม่เกิดหากคุณใช้การ encode บางแบบเช่น TIS620 หรือ Windows874 แต่หากใช้คุณ UTF-8 ล่ะก็คุณจะเจอปัญหาแบบที่ผมเจอเนี่ยแหละ วิธีการแก้ปัญหาก็คือ คุณต้องใช้ฟังก์ชั่น mb_substr() (โดยตัว mb_ ข้างหน้าหมายถึง multi-byte) ทดแทนการใช้ substr() ไปเลยครับ ปัญหาก็จะหมดไป จุดต่างของการใช้ mb_substr คือจะต้องประกาศรหัสที่คุณใช้ให้ฟังก์ชั่นนี้มันรู้ด้วย โดยระบุลงไปตาม syntex ของคำสั่งแหละค