หลังจากที่แปลงตัวเอง หันมาใช้ utf-8 อยู่พักหนึ่ง จะได้ไม่ตก trend ^^ แต่มาไม่นานนี้ เพิ่งได้ลงไปยุ่งกับ string processing แบบเยอะๆ สักหน่อย คือเขียน app มา parse blog content ที่มาจาก WYSIWYG ที่ output html มาแบบไม่ welform แต่ต้องเอาไปขึ้นแสดงใน wap page จึงต้องไป parse มันสักหน่อย อย่างน้อยๆ ก็ให้มัน welform และตัด tag ส่วนใหญ่ออกไป

ถ้าจะมองแค่ว่า html ที่ได้มามันไม่ welform เราก็ strip_tags ออกไปเลยสิ ... มันก็ทำได้ ไม่ได้ยากอะไร และผมก็ทำอยู่ แต่ว่าผมก็ยังอยากจะเก็บ tag img ไว้ เพื่อใน blog ที่แสดงใน wap page จะได้ไม่จืดชืดเกินไป และนอกจากจะเก็บ img ไว้แล้ว ก็ยังจะต้องมานั่งตัดแบ่งหน้า ให้เนื้อหาของ blog อีก เช่น ถ้า blog มีเนื้อหาเยอะ เราก็จะแบ่งหน้าให้มันแสดงหน้าละไม่เกิน ประมาณ 400-500 ตัวอักษร เป็นต้น

ในตอนที่มา process utf-8 string นี่แหล่ะ โดยเฉพาะ string ที่เป็นภาษาไทย จะเห็นเลยว่า function เกี่ยวกับ string ต่างๆ ที่เราใช้กันอยู่เป็นประจำ เช่น substr(), strpos() และอื่นๆ มันชักเริ่มมีปัญหาซะแล้ว เช่น

&lt;?php<br />
&nbsp;&nbsp;&nbsp; // UTF-8<br />
&nbsp;&nbsp;&nbsp; $myStr = &quot;กขคงจ&quot;;<br />
&nbsp;&nbsp;&nbsp; $myChar = substr($myStr, 0, 1);<br />
&nbsp;&nbsp;&nbsp; echo $myChar;<br />
?&gt;

แทนที่ $myChar มันจะได้ 'ก' มา มันกลับไม่ได้ แต่ได้ '�' อะไรประมาณนี้มาแทน เพราะอะไร ... เพราะว่า utf-8 จะใช้ 3 bytes ในการเก็บอักขระไทย 1 ตัวหน่ะสิครับ คือ คุณต้อง

$myChar = substr($myStr, 0, 3);

ถึงจะได้ 'ก' มา แต่ถ้าหากเป็นภาษาอังกฤษ utf-8 ก็จะใช้เพียง 1 byte ในการเก็บตักอักษรแต่ละตัว เพราะงั้น ถ้า string ของเรามีทั้งไทย และอังกฤษปนกัน (ซึ่งปกติ มันก็จะเป็นยังงี้อยู่แล้ว) เราจะทำยังงัยดี จะ substr() มาทีละ 1 ตัว หรือ 3 ตัว ถึงจะได้ตัวอักขระมาหนึ่งตัว อย่างถูกต้อง

แต่ปัญหานี้จะสามารถแก้ไขได้ ถ้าเรามาใช้ Multibye string function (mb_*) แทน String function (str_*, etc.) แบบเดิม แต่ก่อนจะใช้ได้ ก็คงต้อง install ก่อนน้ะครับ ให้ admin เขาทำให้ หรือ ดูรายละเอียดได้ที่นี่

เช่นในกรณีตัวอย่างข้างต้น ถ้าต้องการอักษรตัวแรก เราต้องแก้ code เป็นประมาณนี้แทน

&lt;?php<br />
&nbsp;&nbsp;&nbsp; // UTF-8<br />
&nbsp;&nbsp;&nbsp; $myStr = &quot;กขคง&quot;;<br />
&nbsp;&nbsp;&nbsp; $myChar = mb_substr($myStr, 0, 1, 'UTF-8');<br />
&nbsp;&nbsp;&nbsp; echo $myChar; // ได้แล้ว 'ก'<br />
?&gt;

หรือ ถ้าต้องการตัดเอา string ตั้งแต่ตัวที่ 2 ไป จากเดิมที่เราเขียนประมาณนี้ 
&lt;?php<br />
&nbsp;&nbsp;&nbsp; // ASCII<br />
&nbsp;&nbsp;&nbsp; $str1 = &quot;กขคง&quot;;<br />
&nbsp;&nbsp;&nbsp; $str2 = substr($str1, 1);<br />
&nbsp;&nbsp;&nbsp; echo $str2; // จะได้ 'ขคง' ออกมา<br />
?&gt;

แต่ถ้าโปรแกรมของเราเป็น UTF-8 ต้องเปลี่ยนมาใช้ multibyte string function แทน เช่น
&lt;?php<br />
&nbsp;&nbsp;&nbsp; // UTF-8<br />
&nbsp;&nbsp;&nbsp; $str1&nbsp;&nbsp; = &quot;กขคง&quot;;<br />
&nbsp;&nbsp;&nbsp; $strLen = mb_strlen($str1, 'UTF-8');<br />
&nbsp;&nbsp;&nbsp; $str2&nbsp;&nbsp; = mb_substr($str1, 1, ($strLen-1), 'UTF-8');<br />
&nbsp;&nbsp;&nbsp; echo $str2; // จะได้ 'ขคง' ออกมา<br />
?&gt;

อนึ่ง ในการใช้งาน UTF-8 ให้สมบูรณ์ และจะได้ไม่งง (ปกติโปรแกรมเมอร์จะงงเอง เครื่องมันไม่งง) เราควรใช้ UTF-8 ทั้งที่เก็บใน Database และตัว source code ด้วย ซึ่งตัว source code จะต้อง save เป็น UTF-8 ดังนี้

ข้อพึงสังเกตุ และพึงระวังอีกอย่าง

สำหรับคนที่จะกำลังจะเริ่มใช้งาน UTF-8 อย่างสมบูรณ์ ข้อพึงสังเกตุอีกอย่าง ลองดูตัวอย่างนี้น้ะคับ

&lt;?php<br />
&nbsp;&nbsp;&nbsp; // UTF-8<br />
&nbsp;&nbsp;&nbsp; $str1 = &quot;กขคabc123&quot;; // เราคิดว่า $str1 ควรจะมีความยาว = 9<br />
&nbsp;&nbsp;&nbsp; echo strlen($str1) . &quot;\n&quot;; // จะแสดงเลข 15 ออกมา ซึ่งได้แก่ 9+3+3 คือภาษาไทย มีความยาวตัวละ 3<br />
&nbsp;&nbsp;&nbsp; echo mb_strlen($str1, 'UTF-8') . &quot;\n&quot;; // จะแสดงเลข 9 ออกมา ต้องใช้ mb มาช่วยการทำงานจึงจะถูกต้อง<br />
?&gt;

แต่ถ้าเข้าใจการทำงานของ UTF-8 ก็คงจะชัดเจนดีน้ะคับ ^_^

ปล. ขอบคุณพี่ kamthorn และ pomcob ที่ไกด์เรื่อง Multibyte string function ให้ ^_^