จัดการภาษาไทย (UTF-8) ด้วย Multibyte String Functions

UTF-8 ใช้พื้นที่ 3 ไบต์ ในการเก็บข้อมูลภาษาไทย 1 อักขระ  ดังนั้นจึงไม่สามารถใช้ฟังก์ชัน เช่น strlen() และ substr() กับภาษาไทยที่เป็น UTF-8 ได้ เช่น

$string = "ที่นี่abcd1234";
echo 'strlen() return: '.strlen($string);
ผลลัพธ์ที่ได้คือ
strlen() return: 26

ตัวเลข 26 มาจาก ภาษาไทย 6×3 = 18, ภาษาอังกฤษ 4 และตัวเลข 4 ตัว

ดังนั้นเพื่อให้นับจำนวนตัวอักขระได้อย่างถูกต้องจะต้องใช้ฟังก์ชัน multibyte  string  เช่น จากตัวอย่างข้างต้น จะต้องใช้ฟังก์ชัน mb_strlen() แทน strlen()

$string = "ที่นี่abcd1234";
echo 'mb_strlen() return: '.mb_strlen($string, 'utf-8');
ผลลัพธ์ที่ได้คือ:
strlen() return: 14

จะเห็นว่าได้ผลลัพธ์ตามที่ควรจะเป็นคือ ภาษาไทย 6, ภาษาอังกฤษ 4 และ ตัวเลข 4 ตัว

ในทำนองเดียวกัน เมื่อต้องการตัดประโยคให้สั้นลง เช่น ต้องการเลือกมาเพียง 3 ตัวอักษรแรก  เราจะไม่สามารถใช้ substr() กับภาษาไทยที่ encode ด้วย UTF-8 ได้

$new_string = substr($string, 0, 3);
echo $new_string;
ผลลัพท์ที่ได้คือ:
ท

เพื่อให้ได้ผลลัพธ์ถูกต้องตามที่ต้องการ เราจึงต้องใช้ mb_substr() แทน substr()

$new_string = mb_substr($string, 0, 3,'utf-8');
echo $new_string;
ผลลัพท์ที่ได้คือ:
ที่

จากตัวอย่างข้างต้น จะเห็นว่าจะต้องระบุพารามิเตอร์ตัวที่ 4 คือ encoding เป็น UTF-8 เข้าไปด้วย  เพื่อป้องกันไม่ให้เกิดความผิดพลาดในการใช้งาน เราจึงควรใช้ฟังก์ชัน mb_internal_enconde() กำหนดให้การ encode เป็น UTF-8 ในบรรทัดแรกๆ ของโปรแกรมเลย เช่น

echo mb_internal_encoding();
mb_internal_encoding('utf-8');
echo "<br />";
echo mb_internal_encoding();
ผลลัพธ์ทีได้คือ
ISO-8859-1
UTF-8

นอกจากนี้ เราสามารถใช้ฟังก์ชัน iconv_substr() ในการตัดคำด้วยเช่นกัน

$new_string = iconv_substr($string, 0, 3,'utf-8');
echo $new_string;
ผลลัพท์ที่ได้คือ:
ที่

🙂 

Leave a Reply

7 Comments on "จัดการภาษาไทย (UTF-8) ด้วย Multibyte String Functions"

Notify of
avatar
cnim16
Guest

ตอนนี้ปัญหาภาษาไทยในเว็บไม่มีปัญหาแล้วครับ
สามารถใช้ utf-8 ได้สมบูรณ์

แต่ที่มีปัญหาจะเป็นการรับ และ ส่งออกกับ Excel
พอมีหนทางแก้ไขบ้างไหมครับ

pui
Guest

😛 😛
ขอบคุณนะคะ มีประโยชน์มากๆเลย

itboy
Guest

บทความนี้มีประโยชน์ครับ
ขอบคุณครับ

thunapi
Guest

เราอ่านบทความนาย สองครั้ง ใช่ครังสอง เจ๋งมาก มันจะมีปัญหาเรื่องการตัดคำครับ เช่น ตัด ให้ ภาษาไทยกับ อังกฤษ ถ้าอยากเห็นชัด คือการเว้น บรรทัด อังกฤษ ประมาณเต็มบรรทัด ภาษาไทย จะ ครึงบรรทัด

tewwaruk
Guest

ขอบคุณ เป็นอย่างสูง ผมขอเอาไปใช้แก้ปัญหานะครับ

Eddy
Guest

บทความนี้เยี่ยมเลย ครับ ผมกำลังงมอยู่เลยว่าจะตัดข้อความมาไว้ที่ meta description แต่ตัดมาแล้วเจอ code ที่ผิดๆมาตรงตอนท้ายของข้อความที่ตัดมา ตอนนี้หมดปัญหาเลยอ่า… ขอบคุณนะครับ

wpDiscuz