encoding

24 Feb 2008

บังเอิญได้รับงานเขียนเว็บเล็กๆมางานนึง (เล็กมากๆ) ความต้องการคร่าวๆคือมีข้อมูลบนฐานข้อมูล เอาขึ้นมาแสดงบนเว็บตามต้องการ เื่องด้วยปัจจัยหลายๆอย่างก็เลยเลือกใช้ 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 มาเว็บเรามันผิดนะงิ

Posted by hunt | Feb 25th, 2008 at 11:02 pm | Reply

ให้ save ไฟล์ php เป็น utf-8 เลยนะครับ
รวมทั้งหน้าที่ส่งค่ามาด้วย

Posted by kaze | Feb 27th, 2008 at 1:59 am | Reply

ลองแล้ว ไม่ได้ ครับ

Posted by anonymous | Oct 10th, 2008 at 9:49 am | Reply

Post new comment

The content of this field is kept private and will not be shown publicly.