รายละเอียด Share KM

  • หัวข้อ : ปัญหาเครื่องแม่ข่าย : เว็บไซต์แสดงผลภาษาไทยผิดพลาด

  • หมวด : หมวดการบริหารจัดการ

  • องค์ความรู้ : การนำเทคโนโลยีสารสนเทศมาใช้ในการบริหารจัดการ

  • โครงการ :

  • จัดวันที่ : 26/10/2561

  • ถึงวันที่ : 26/10/2561

  • สถานที่ :

  • จัดโดย :

  • เนื้อหา :

    โดยปกติเมื่อเราพัฒนาเว็บไซต์จะมีการเข้ารหัสตัวอักษรไทยในรูปแบบต่างๆ เช่น

    ANSI คือการบันทึกแบบ 8 บิต ทั้งไทยและอังกฤษ ดังนั้นผู้นำไฟล์ไปใช้ (แสดงบนจอ) จะต้องรู้ว่าตัวอักษรที่สูงกว่า 80h คือภาษาไทย โดยจะใช้ TIS-620 หรือ Windows-874 ก็ได้ เช่น "ABC กขค" จะบันทึกเป็น 41 42 43 20 A1 A2 A4

    Unicode คือการบันทึกแบบ 16 บิต ต่อตัวอักษร หรือ UTF-16 (กรณีภาษาอังกฤษและไทย แต่บางภาษาอาจใช้ 32 บิต) เช่น "ABC กขค" จะบันทึกเป็น FF FE 41 00 42 00 43 00 20 00 01 0E 02 0E 04 0E ค่า FF FE ที่อยู่ต้นไฟล์ คือ BOM (Byte order mark) ของ Unicode UTF-16 สำหรับบอกว่า รหัส Unicode ที่ตามมานั้น จะเรียงโดย ไบต์ต่ำมาก่อน (Little Endian = LE) โปรแกรมทั่วไปสามารถใช้ BOM นี้ในการบอกได้ว่าไฟล์นี้เป็นแบบ UTF-16 (LE)

    Unicode Big Endian คือการบันทึกแบบ UTF-16 แต่เรียงไบต์สูงมาก่อน (Big Endian) เช่น "ABC กขค" จะบันทึกเป็น FE FF 00 41 00 42 00 43 00 20 0E 01 0E 02 0E 04 ค่า FE FF ที่อยู่ต้นไฟล์ คือ BOM ของ UTF-16 ((Big Endian =BE)

    UTF-8 คือการบันทึกอักษรอังกฤษ เป็นแบบ 8 บิต และบันทึกอักษรไทยแบบ 24 บิต (3 ไบต์) ซึ่งตัวอักษรอังกฤษถูกต้องเสมอในโปรแกรมที่ทำงานแบบ 8 บิต ส่วนภาษาอื่นต้องถอดรหัสเอง เช่น "ABC กขค" จะบันทึกเป็น EF BB BF 41 42 43 20 E0 B8 81 E0 B8 82 E0 B8 84 ค่า EF BB BF ที่อยู่ต้นไฟล์ คือ BOM ของ UTF-8 แต่ใน UTF-8 ค่านี้ไม่มีผล เพราะเรียงข้อมูลเป็นแบบไบต์อยู่แล้ว โปรแกรมทั่วไปสามารถใช้ BOM นี้ในการบอกได้ว่าไฟล์นี้เป็นแบบ UTF-8

    TIS-620 เป็นที่ยอมรับกันในมาตรฐานสากล ประเทศไทยมีมาตรฐานอักขระซึ่งกำหนดโดย สำนักงานมาตรฐานอุตสาหกรรม ดังที่เรียกกันโดยทั่วไปว่ารหัส สมอ. แต่รหัส สมอ. หรือที่มีชื่อทางการว่า มอก.620 หรือ TIS-620 นี้ เป็นมาตรฐานของประเทศไทย ซึ่งเมื่อนำไปใช้บนเครือข่ายอินเทอร์เน็ต ก็อาจเกิดความเข้าใจไม่ตรงกันได้ ดังนั้นจึงมีความพยายามที่จะจดทะเบียน รหัส สมอ. ที่ Internet Assigned Numbers Authority (IANA) ซึ่งเป็นผู้ควบคุมมาตรฐานของเครือข่ายอินเทอร์เน็ต และได้ดำเนินการจดทะเบียนจนสำเร็จ เมื่อวันที่ 22 กันยายน 2541 Tis-620 เป็น character set ที่จดทะเบียนถุกต้อง เป็นที่รับรู้กันทั่วโลก ทุกระบบปฏิบัติการ (แม้แต่ระบบปฏิบัติการของไมโครซอฟต์เอง) tis-620 มีข้อดีตรงที่ว่า ในช่วงที่เป็นข้อความภาษาไทย ถ้าเป็น UTF-8 จะใช้พื้นที่เยอะกว่าถึง 2-3 เท่าตัว (ตรงภาษาอังกฤษ ใช้พื้นที่เท่าเดิมคือ 1 byte) พื้นที่เยอะ ไม่ได้หมายถึงว่าจะกระทบกับพื้นที่ใน Hard disk อย่างเดียว (Hard disk เราค่อนข้างเหลือเฟืออยู่แล้ว) มันจะมีผลกับการรับส่งข้อมูล 2-3 เท่าตัว ถ้าเป็นหน้าที่ไม่มีอะไร บอกแค่ว่า “ได้รับข้อมูลแล้ว ขอบคุณที่ร่วมกิจกรรม” แค่นี้คงไม่ต่างอะไรมาก แต่ถ้ามันเป็นหน้าที่มีข้อมูลจำนวนเยอะ มีข้อความเยอะมาก อย่างใน Community ใน Web board อันนี้จะเริ่มเห็นความต่าง ทางด้านความเร็วแล้ว

    WINDOWS-874 ในทางเทคนิคแล้ว windows-874 เป็น character set ที่เป็น superset ของ tis-620 (คำว่า super set หมายถึงว่า อะไรที่ tis-620 มี นั้น windows-874 มี) ดังนั้น เมื่อดูผลที่ออกมาจึงทำงานได้เหมือนกันทุกประการ windows-874 เป็น character set ที่ใช้ภายในระบบปฏิบัติการที่ผลิตโดยบริษัท ไมโครซอฟต์ เท่านั้น ไม่ได้เป็น character set ที่ใช้ในการแลกเปลี่ยนข้อมูลระหว่างเครื่อง ถ้านำ ไปใช้ใน การรับส่งข้อมูลระหว่างเครื่อง ระบบปฏิบัติการอื่นจะไม่เข้าใจรหัสเพิ่มเติมเหล่านี้ (และในทำนองเดียวกัน ในระบบปฏิบัติการอื่นๆ ก็จะมีส่วนขยายเพิ่มเติมภายใน ที่ ระบบปฏิบัติการของไมโครซอฟต์ไม่เข้าใจเช่นกัน) การที่ตั้งเป็น windows-874 จะมีผลกับแค่ Browser ที่ทำงานอยู่บนระบบปฏิบัติการของไมโครซอฟต์เท่านั้น

    ปัญหา encoding คือ อาการซึ่งซอฟต์แวร์คอมพิวเตอร์แสดงตัวอักษรที่ไม่ถูกต้อง เนื่องจากการตั้งค่ารหัสอักขระที่ไม่ตรงกัน ทำให้ผู้ใช้เห็นข้อความที่อ่านไม่ออกและมักจะเห็นเป็นอักษรแปลกตาที่มาจากภาษาอื่น จึงเรียกอาการนี้กันทั่วไปว่าภาษาต่างดาว

    เช่น แฟ้มข้อมูลที่มีคำว่า "ภาษาไทย" ที่เข้ารหัสด้วยมาตรฐาน TIS-620 เมื่อนำไปแสดงบนซอฟต์แวร์ตะวันตกที่ไม่ได้รองรับภาษาไทย จะใช้ชุดอักขระรหัส ISO-8859-1 แสดงผล ทำให้เห็นข้อความเป็น "ÀÒÉÒä·Â" หรือแฟ้มข้อมูลที่มีคำว่า "ภาษาไทย" ที่เข้ารหัสด้วยมาตรฐาน UTF-8 เมื่อนำมาแสดงบนซอฟต์แวร์ไทยที่ใช้การเข้ารหัส TIS-620 จะแสดงผลเป็น "เธ เธฒเธฉเธฒเน„เธ—เธข"

    วิธีแก้ปัญหา

    1.       กำหนด Header ให้ใช้เป็น utf-8

    http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>

    2.       กำหนดในส่วนของ Connection

    - กรณีที่กำหนด Collation เป็น utf8_unicode_ci ให้ใช้

    $objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");

    $objDB = mysql_select_db("mydatabase");

    mysql_query("SET NAMES UTF8");


     

    - กรณีที่กำหนด Collation อื่น ๆ ให้ใช้

    $objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");

    $objDB = mysql_select_db("mydatabase");

    mysql_query("SET character_set_results=utf8");

    mysql_query("SET character_set_client=utf8");

    mysql_query("SET character_set_connection=utf8");

    3.       การแก้ปัญหา ภาษาไทย อ่านไม่ออกในหน้าเว็บ เนื่องจากปัญหา Encoding ไม่กันของข้อมูลที่ php ส่ง Output ออกไปให้ Browser กับที่ที่กำหนด charset ของ html ไม่ตรงกับ php

    เราสามารถใช้ ฟังก์ชั่น icov แปลง UTF-8 เป็น TIS-620 หรือ Convert charset TIS-620 to UTF-8 แล้ว ยังสามารถแปลงข้อความเป็นช่วงๆ ได้ด้วย ob_iconv_handler() ฟังก์ชั่น ob_iconv_handler ใช้คู่กับ ob_start() และ iconv_set_encoding() เช่น

    iconv_set_encoding("internal_encoding", "TIS-620");

    iconv_set_encoding("output_encoding", " UTF -8");

    ob_start("ob_iconv_handler");

    ob_end_flush();

    จากโค้ดตัวอย่าง ใช้ob_start เรียกให้ob_iconv_handler ทำงานแล้วแปลง encoding ด้วยiconv_set_encoding ต้นทางเป็น TIS-620 ปลายทางเป็น UTF-8

    เท่านี้เว็บเราก็สามารถแสดงผลภาษาไทยแบบ UTF-8 สามารถนำไปใช้กับการแปลง encoding ได้ทุกๆ ภาษา

*************************************************************************
สร้างบทความโดย :
สร้างบทความวันที่ : 8/8/2562

อัปเดท :
โดย : -
ไฟล์แนบ :
>> ไฟล์แนบที่ 1 <<

รูปภาพที่ : 1

รูปภาพที่ : 2