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 ของคำสั่งแหละครับ คือ ..

จากเดิม
= substr([ชุดตัวอักษร],[จาก],[ถึง]) 
เปลี่ยนมาใช้
= mb_substr([ชุดตัวอักษร],[จาก],[ถึง],[ระบุการเข้ารหัสที่ใช้อยู่])
ฟังก์ชั่น substr() เป็นฟังก์ชั่นที่เห็นได้ทั่วไปในเอกสารหรือหนังสือสอนเขียนโปรแกรมภาษา php ทุกเล่ม มันมีประโยชน์จริงและดูเหมือนว่าจะใช้ได้กับหลายๆงาน พอมาเจองานนี้ผมเองก็งงอยู่นิดหน่อย และไม่เคยรู้จักฟังก์ชั่น mb_substr() มาก่อนเลย เรียกว่ามันเกิดมาเพื่อใช้กับเรื่องนี้เลยก็ว่าได้ 

งั้นก็ขอพื้นที่ตรงนี้ก็ขอดราม่าหน่อยนึงละกัน...ของบางอย่างอาจมีค่าในระดับสามัญ (ทั่วๆไป) แต่ของทุกอย่างแม้จะดูเหมือนไม่มีค่าไม่น่ารู้จักในตอนแรก แต่เชื่อเถอะว่ามันมีคุณค่าพิเศษในตัวของมันเอง และเมื่อถึงเวลาของมันจริงๆแล้วล่ะก็.."อะไรก็แทนไม่ได้"

เรื่องมันก็มีอยู่เท่านี้แหละครับ ขอบคุณที่เข้ามาอ่าน ..ขอให้การงานราบรื่น
โชคดีครับ

อ้างอิง/อ่านเพิ่มเติม 
mb_substr : http://php.net/manual/en/function.mb-substr.php
iconv_substr : http://th.php.net/manual/en/function.iconv-substr.php

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

เมื่อ VFP Table พัง

VFP SQL UPDATE ปรับปรุงค่าในฟิลด์ด้วยค่าจากตารางอื่น

การใช้ Array ร่วมกับ Function