แสดงบทความที่มีป้ายกำกับ ภาษาไทย แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ ภาษาไทย แสดงบทความทั้งหมด

วันศุกร์ที่ 7 มกราคม พ.ศ. 2554

ใช้งาน cookie บน javascript กับภาษาไทย

เผอิญได้โจทย์มาว่าใน contact form user นั้นควรกรอกแค่ครั้งเดียว ครั้งต่อไปเข้ามาหน้า contact ก็ไม่ควรต้องกรอกอีก ซึ่งผู้ที่จะกรอกนั้นจะเป็น anonymous ดังนั้นวิธีการที่จะทำให้หน้า contact จำค่าได้ก็คงต้องใช้ cookie

ปัญหาคือหน้า contact form นั้นอยู่ใน drupal ซึ่งเมื่อเปิด page cache แล้วมันจะทำให้ใช้งาน cookie สำหรับ anonymous ไม่ได้ ดังนั้นเลยต้องเลี่ยงไปใช้ cookie ของ javascript แทน

จาก tutorial http://www.w3schools.com/JS/js_cookies.asp ก็ดูเหมือนจะทำงานได้ดีแต่พอเรานำไปใช้จริงและกรอกค่าใน form เป็นภาษาไทย ผลลัพธ์ก็คือ ภาษาไทยเละ ดังนั้นเราจึงต้อง customize code กันนิดหน่อยเพื่อให้ใช้งานภาษาไทยได้

original code

function getCookie(c_name) {
  if (document.cookie.length > 0) {
    c_start = document.cookie.indexOf(c_name + "=");
    if (c_start != -1) {
      c_start = c_start + c_name.length+1;
      c_end = document.cookie.indexOf(";", c_start);
      if (c_end == -1) 
        c_end = document.cookie.length
      return unescape(document.cookie.substring(c_start,c_end));
    }
  }
  return "";
}

function setCookie(c_name, value,expiredays) {
  var exdate = new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  document.cookie = c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

customized code

function getCookie(c_name) {
  if (document.cookie.length > 0) {
    c_start = document.cookie.indexOf(c_name + "=");
    if (c_start != -1) {
      c_start = c_start + c_name.length+1;
      c_end = document.cookie.indexOf(";", c_start);
      if (c_end == -1) 
        c_end = document.cookie.length
      return decodeURIComponent(document.cookie.substring(c_start,c_end));
    }
  }
  return "";
}

function setCookie(c_name, value,expiredays) {
  var exdate = new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  document.cookie = c_name+ "=" +encodeURIComponent(value)+((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

เพื่อให้ใช้งานภาษาไทยได้ ต้องใช้ function encodeURIComponent แทน function escape แต่ปัญหายังไม่หมดแค่นี้ เมื่อเรา getCookie ที่ภายใน text นั้นมี space เข้ามาใช้งาน space ที่เคยพิมพ์เข้าไปจะกลายเป็นเครื่องหมาย + แทน ดังนั้นเราต้อง replace มันก่อนที่จะนำไปใช้งานด้วย

getCookie('c_name').replace(/\+/g, " ")

ซึ่ง /\+/ นั้นหมายถึงเครื่องหมาย + และ g หมายถึงให้ replace ทั้ง string
Continue Reading...

วันพุธที่ 5 มกราคม พ.ศ. 2554

แก้ปัญหาชื่อภาษาไทยบน Alfresco เละใน Version 3.4 บน Windows

เมื่อลง Alfresco 3.4 บน Windows แล้วเมื่อสร้าง Space หรือไฟล์ที่มีชื่อภาษาไทยแล้ว ชื่อไฟล์ดังกล่าวจะกลายเป็น ????

ปัญหาดังกล่าวเกิดจาก default character set ใน MySQL ไม่ได้ถูกตั้งค่าให้เป็น UTF-8 เหมือน Version ก่อนๆ ทำให้ Table ที่สร้างขึ้นมาไม่ได้มี Collation เป็น UTF-8 เมื่อมีการ Insert ภาษาไทยเข้าไปใน Table จึงทำให้ภาษาไทยเละ

วิธีการแก้ไขคือเราต้อง alter table ให้มันกลายเป็น UTF-8 ซะก่อนซึ่งจะให้ alter ที่ละ table มันก็จะเหนื่อยไปนิด ดังนั้นก็เลยเขียน php เพื่อที่จะ alter table ให้กลายเป็น UTF-8 ทั้งหมดซะ

<?php
  $db = mysql_connect('localhost','username','password');
  if(!$db) echo "Cannot connect to the database - incorrect details";
  mysql_select_db('alfresco');
  mysql_query('ALTER DATABASE CHARACTER SET utf8');
  $result=mysql_query('show tables');
  while($tables = mysql_fetch_array($result)) {
    foreach ($tables as $key => $value) {
      mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
    }
  }
?>

เมื่อรันแล้วให้ลอง restart alfresco ซักทีนึงแล้วก็ลองดูว่าภาษาไทยสามารถใช้งานได้หรือยัง ถ้ายังให้ไป set default character ใน MySQL ให้เป็น UTF-8 ตาม link นี้ครับ http://www.leknarm.com/2010/01/set-mysql-utf8.html
--
Tantai Thanakanok. Open Source Development Co., Ltd.
Tel: +66 38 311816, Fax: +66 38 773128, http://www.osdev.co.th/
Continue Reading...

Blogroll

About