เนื้อหา :
โดยปกติเมื่อเราพัฒนาเว็บไซต์จะมีการเข้ารหัสตัวอักษรไทยในรูปแบบต่างๆ
เช่น
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 ได้ทุกๆ ภาษา