เล็กๆน้อยๆกับ UTF-8

Wednesday, November 5th, 2008

ก็บังเอิญมารื้อเว็บรถยนต์มือสองของตัวเองใหม่ แล้วทำให้เป็น UTF-8 ทั้งหมดจากเดิมใช้เป็น Tis-620 ผมว่าหลายๆเว็บอาจจะเคยมีปัญหากับเรื่องของการตัดคำด้วยการใช้ UTF-8 แน่นอน เพราะตอนที่ใช้พวก Tis-620 มันไม่มีปัญหาครับ แต่มันจะมีปัญหากับ UTF-8

ตัวอย่างการตัดคำที่ผิดพลาดครับ

utf-8-01.jpg

ลองดูที่มีตัวสี่เหลี่ยมนั่นแหล่ะครับที่เกิดจากการตัดคำบน UTF-8 แล้วมีปัญหา

ลองมาทดสอบกันง่ายๆกับโค๊ดนี้

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Untitled Document</title>
</head>
<body>
<?php
$text = “สวัสดีครับพ่อแม่พี่น้อง”;
$newtext = substr($text, 0,10);
echo $newtext ;
?>
</body>
</html>

เมื่อลองทดสอบกับไฟล์ตัวนี้จะได้ผลออกมาเป็น

สวั�

แบบนี้ก็ไม่ถูกต้องแน่นอน

แต่ก็สามารถแก้ไขได้ง่ายๆ ลองดูโค๊ดนี้เทียบกันครับ

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Untitled Document</title>
</head>
<body>
<?php
$text = “สวัสดีครับพ่อแม่พี่น้อง”;
$newtext = iconv_substr($text, 0,10, “UTF-8″);
echo $newtext ;
?>
</body>
</html>

ผลออกมาก็จะถูกต้องครับ ก็แสดงผล สวัสดีครับ ขึ้นมาครับ 

ความต่างของมันคือคำสั่งที่เรียกมาตัดคำครับ จาก substr เปลี่ยนมาใช้ iconv_substr หรือจะไปใช้อีกแบบก็คือ

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Untitled Document</title>
</head>
<body>
<?php
$text = “สวัสดีครับพ่อแม่พี่น้อง”;
mb_internal_encoding(”utf8″);
$newtext = mb_substr($text, 0, 10);

echo $newtext ;
?>
</body>
</html>

ก็ไม่มีใครว่าเหมือนกันครับ ทั้ง 2 แบบก็ไม่ต่างกันครับ ก็เพียงแค่เรียกโมดูลการทำงานคนละตัวกัน

iconv_substr เป็นการใช้ library iconv ของ OS
ส่วนอีกอันหนึ่งนั้น เป็น built in function ของ php นั่นเอง (multibyte string)

ก็เลือกใช้กันไป…. ลองไปอ่านเพิ่มได้ที่ http://th.php.net/iconv_substr

Editor's Talk!

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

นายแม็ค

ค้นหา :