วันอาทิตย์, กรกฎาคม ๒๙, ๒๕๕๐

PHP AJAX Autocomplete - จะใช้ของ ฝรั่งทำมายังงัย ก็ต้องเอามาปรับอยู่ดี

ไม่ใช่เซียนเว็บจ๋านะ แต่มันต้องใช้ฟังก์ชันนี้ เลยได้เล่มนี้มา

ปัญหาก็คือ บ้านเรามันใช้ภาษาไทย
คนเขียนซอร์สโค๊ดมาเค้าใช้ภาษาอังกฤษ
คนเขียนคอมไพล์ผ่าน 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);

เป็นอันเรียบร้อย

๒ ความคิดเห็น:

kergrit กล่าวว่า...

ที่ต้องปรับเพราะ เรื่องของ characterset ครับ
เวลาทำกับภาษาไทยหรือภาษาใดๆ นั้น ตอนที่จะส่ง keyword ที่ต้องการค้นหาไปกับ AJAX นั้นจะต้องมีการเข้ารหัสก่อน โดยใช้ function encodeURI

แล้วจะใช้งานได้ปกติครับรับรองได้
var url = "your ajax path and parameter"+encodeURI(keyword);

ไม่ระบุชื่อ กล่าวว่า...

พี่ค่ะอยากได้ ที่search แล้วหาภาษาไทยเจอเลยค่ะ เป็นajax คือว่าด่วนมาเลยค่ะ ขอบคุณค่ะ