บังเอิญได้รับงานเขียนเว็บเล็กๆมางานนึง (เล็กมากๆ) ความต้องการคร่าวๆคือมีข้อมูลบนฐานข้อมูล เอาขึ้นมาแสดงบนเว็บตามต้องการ เื่องด้วยปัจจัยหลายๆอย่างก็เลยเลือกใช้ PHP กับ MySQL
จริงๆแล้วก่อนที่จะหัดใช้ ASP.NET ก็เคยเขียน PHP มาอยู่ก่อนแล้ว ยิ่งช่วงหลังก็ได้กลับมาลองเล่นอยู่เนืองๆก็เลยไม่ค่อยเจอปัญหาเท่าไหร่ แต่ก็มีที่เจอคือเรื่ื่อง encoding นี่แหละ
โจทย์ก็คือว่า ข้อมูลบางอย่างจำเป็นต้องส่งผ่านมาทาง query string โดยจะส่งมาเป็นข้อความ เช่น
?q=ยางลบ
แล้วดึงคำว่า ยางลบ ไปเทียบกับในฐานข้อมูล ถ้านึกไม่ออกลองดูที่หน้า Exteen Tag แบบเดียวกันเลย
จำลองสถานะการณ์ด้วยโค้ดนี้ละกัน
<?php
echo $_GET['q'];
พอลองเอาไปรัน ด้วยการก๊อปปี้ q.php?q=rubber ไปวางบนโลเคชันบาร์ของไฟร์ฟ็อกซ์ แล้วรัน ก็จะได้ผลตามปกติ คือได้ผลลัพธ์เป็น rubberพอลองเปลี่ยนเป็น q.php?q=ยางลบ ก็ยังได้คำว่า ยางลบ เหมือนเดิม แต่พอเปลี่ยน encoding เป็น utf-8 ปั๊บ ปัญหา็้ก็เริ่มบังเกิด
ก็เลยลองเปลี่ยน encoding เป็น TIS-620
นั่น ลองหันเข้าหาวิชามาร เล่น iconv ซะ
<?php
echo iconv('tis-620', 'utf-8', $_GET['q']);
มันก็ใช้ได้ทันที แต่เมื่อคืนเกือบมีคนบ้าตายเพราะ iconv แปลงคำว่า ‘ยางลบ’ ไปเป็น ‘างลบ’ ลองถามทั้ง hunt และ ipats ก็แล้ว ก็ยังแก้ไม่ได้ กลับไปแก้อีกทีแก้ไปแก้มา ก็ใช้ได้ซะงั้น แต่ไอ้ที่แก้นี่ไม่ได้เกี่ยวกับเรื่อง encoding แต่อย่างใด
ทีนี้ จากการจำได้ ว่าเคยทำวิธีคล้ายๆแบบนี้ใน .NET เหมือนกัน แล้วไม่มีปัญหา ก็เลยเอามาลองดู เปิด VS 2008 แล้วทำคล้ายๆกันดู
<!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">
<body>
<asp:Label ID="XLabel" runat=server></asp:Label>
</body>
</html>
แล้วในหน้า code-behind ก็ใส่ตรง Load Event เป็น
public void Page_Load(object sender, EventArgs e)
{
XLabel.Text = Request.QueryString["q"];
}
พอลองรันดูก็ไ้ด้ความว่า ไม่ต่างกันกับ php
แล้วจะทำยังไง ทางแก้ก็คือในไฟล์ web.config จะมี element globalization อยู่เพื่อทำหน้าที่นี้ ก็เลยเพิ่ม element นี้เข้าไป ในส่วนของ system.web
<globalization requestEncoding="windows-874"/>
แต่วิธีนี้มันก็ไม่ค่อยดีเท่าไหร่ ก็เลยลองดูอีกวิธี
public void Page_Load(object sender, EventArgs e)
{
Encoding tEncoding = Encoding.GetEncoding("tis-620");
byte[] b = tEncoding.GetBytes(Request.QueryString["q"]);
XLabel.Text = tEncoding.GetString(b);
}
ตรงนี้ก็จะได้ที่เป็น Unicode เรียบร้อยแล้ว
Some facts about unicode in .NET
- In .NET, there are 4 encodings available for Unicode; Unicode, UTF8, UTF7, and UTF32.
- In fact, the ‘Unicode’ for .NET means UTF-16. It is the default internal encoding for string in .NET.



Comments
งง จากปัญหาที่ว่านี้ ใช้ rawurldecode ได้ไม่ใช่หรือ ??
ปล. link มาเว็บเรามันผิดนะงิ
ให้ save ไฟล์ php เป็น utf-8 เลยนะครับ
รวมทั้งหน้าที่ส่งค่ามาด้วย
ลองแล้ว ไม่ได้ ครับ
Post new comment