ปัญหาก็คือ บ้านเรามันใช้ภาษาไทย
คนเขียนซอร์สโค๊ดมาเค้าใช้ภาษาอังกฤษ
คนเขียนคอมไพล์ผ่าน result ขึ้น
เอามาใช้ กับเราก็ขึ้นเหมือนกัน ขึ้นแต่ภาษาอังกฤษนะ
ภาษาไทยใส่เข้าไป ไม่มีเอ๊าท์พุต ไม่เจอเรกคอร์ด ไม่มีข้อมูลที่เกี่ยวข้อง
อันนี้ก็เป็นอันนึงภาษาอังกฤษก็ผลออกมาถูกดี
แต่พอใส่ภาษาไทย ผลไม่ขึ้น ทั้งๆที่เช็คแล้ว ทุกขั้นตอน
ยิ่งงาน AJAX มีขั้นตอนให้ไล่เยอะ HTML <-> JavaScript <-> PHP
สืบไปสืบมา ก็เจอปัญหา เรื่องภาษานี่แหละ
คือมันมีปัญหา ตอน JavaScript ส่ง Parameter ไปใช้ PHP แบบ GET
พูดถึงส่งข้อมูลแบบ GET คือ ส่ง Parameterไปกับ URL เช่น
view.php?user=gunda
หรือ
thread.php?id=K122GSBPA8D72H2WJ
ส่งข้อมูลแบบนี้มันทำให้ Bookmark หน้านั้นได้ Bookmark หน้านั้น ก็คือ Bookmark ข้อมูลที่ส่งไปด้วย
ถ้า Bookmark ไว้ตอนสั่งซื้อของ กด Bookmark นี่ทีไร ก็เป็นอันว่าสั่งซื้อของทุกที
หรือข้อมูลที่ต้องให้ Bookmark ได้ ก็เช่น หน้าที่ไป Category เป็นต้น
view.php?category=0
ถ้า Bookmark หน้านี้ไว้ เปิดมาก็เป็นหน้าเดิม(แต่ข้อมูลอัพเดตขึ้น)ทุกที
เป็นที่มาของการส่งข้อมูลว่า ส่งข้อมูลที่ไม่ควรจำ ให้ไปส่งแบบ POST
แบบ POST จะส่งข้อมูลไม่ให้ผู้ใช้เห็น ข้อมูลก็ปลอดภัย
ที่นี้ แบบ GET เลยต้องป้องกันตัวเอง ไม่ให้ใครส่งงข้อมูลที่เป็นอันตรายไปที่เว็บ
ข้อมูลนั้นอาจจะเป็นอักขระพิศษ เช่น พอเจออักษรตัวนี้ปุ๊ป ปิดเครื่อง ซะ เป็นต้น
ไอ่อักขระพวกนี้ ก็รวมภาษาไทย ด้วย
ตามมาตรฐาน ASCII 1 ไบต์ เก็บได้ 256 แบบ
128 อักษร เก็บ ภาษาอังกฤษ
128 ที่เหลือ เก็บแต่ละภาษาแล้วแต่ที่มันอยู่ อยู่เมืองไทยมันก็ แปลให้เป็นภาษาไทย.. -> อักษร อันตราย
ภาษาไทย อันตราย มันเลย เข้ารหัส ให้เป็นภาษาอังกฤษซะ เช่น
พ เข้ารหัส เป็น %BE
BE เป็น เลขฐาน 16 คือ 190 ในฐานสิบ ตัวใหญ่เล็ก ไม่ต่าง
กลับมาเรื่องโปรแกรม..
ตอน JavaScript ส่ง Parameter ไปให้ PHP แบบ GET มันเข้ารหัส (encode) แบบ JavaScript ให้
ไม่ใช่แบบที่ PHP อ่านออก
ตัวอย่าง
PHP -> urlencode('พ') -> %BE
PHP -> urldecode('พ') -> พ
JavaScript -> escape('พ') -> %u0E1E
JavaScript -> unescape('พ') -> พ
PHP -> urlencode('p') -> p
PHP -> urldecode('p') -> p
JavaScript -> escape('p') -> p
JavaScript -> unescape('p') -> p
PHP -> urlencode('%BE') -> %25BE
PHP -> urldecode('%BE') -> พ
JavaScript -> escape('%BE') -> %25BE
JavaScript -> unescape('%BE') -> ¾
PHP -> urlencode('%u0E1E') -> %25u0E1E
PHP -> urldecode('%u0E1E') -> %u0E1E
JavaScript -> escape('%u0E1E') -> %25u0E1E
JavaScript -> unescape('%u0E1E') -> พ
ไม่มีฟังก์ชัน Javascript ที่เปลี่ยน "พ" เป็น "%BE"
เขียนใหม่ได้ว่า
function myEncode(input)
{
var output = "";
for(i=0;i{
if(input[i]>='ก')
{
output += '%'+(input[i].charCodeAt(0)-'ก'.charCodeAt(0)+161).toString(16);
}
else
{
output += input[i];
}
}
return output;
}
เปลี่ยนจาก
xmlHttpGetSuggestions.open("GET", getFunctionsUrl + encode(keyword), true);
เป็น
xmlHttpGetSuggestions.open("GET", getFunctionsUrl + myEncode(keyword), true);
เป็นอันเรียบร้อย