เกี่ยวกับเรื่อง character set และ utf-8 กะ tis-620

หลายๆคนอาจจะสังสัยครับ เรื่อง character set คืออะไร ทำไมต้อง tis-620 หรือ utf-8 แล้ว utf-8 กะ tis-620 มันต่างกันอย่างไร คำถามพวกนี้เจอเยอะครับ และก็มักจะมีปัญหากันอยู่ไม่กี่เรื่องครับ อาทิเช่น หน้าเว็บเป็น ???? ทั้งที่ในฐานข้อมูลอ่านได้ปกติ หรือบางทีหน้าเว็บก็เป็นตัวสี่เหลี่ยมๆๆ หรือไม่ก็เป็นภาษาต่างดาวขะหยึกขะหยึย(จริงๆไม่ใช่ภาษาต่างดาวหรอกครับ มันคือภาษาละติน) หรือบางครั้งฐานข้อมูลเป็น ???? ทั้งที่ป้อนข้อมูลเป็นภาษาไทย ผมเคยตอบคำถามไว้ใน http://www.mambo.or.th อยู่หลายครั้งครับ ผมจะยกเอามาแปะไว้ที่นี่เลยแล้วกันนะครับ

       "รหัสของชุดตัวอักษรบนโลกใบนี้มีเยอะแยะมากมายครับ โดยหลักๆ จะแบ่งได้เป็นสองประเภทใหญ่คือ ascii กับ unicode   รหัส ascii นั้นเกิดก่อน unicode ครับใช้โดยปกติจะใช้เนื้อที่เก็บข้อมูล 1 ไบต์ต่อ 1 ตัวอักษร ยกเว้นภาษาที่เป็น multibyte บางภาษาครับ อย่างเช่น ญี่ปุ่น จีน เกาหลี ฯลฯ ที่อาจจะใช้ 2 ถึง 4 ไบต์ในการเก็บตัวอักษร 1 ตัว สามารถศึกษาเรื่อง unicode เพิ่มเติมได้ที่ http://www.unicode.org
       เนื่องจากจำนวนตัวอักษรเยอะมาก สำหรับ ascii นั้น เนื้อที่ 1 ไบต์ก็สามารถเก็บข้อมูลได้ตั้งแต่ 0-255 ครับ 128 แรกใช้เก็บภาษาอังกฤษ(0x00-0x7f=0-127) ส่วน 128 หลัง(0x80-0xff=128-255) ใช้เก็บข้อมูลของภาษาอื่นๆ แล้วแต่ว่าหน้าเว็บเข้ารหัสเป็นอะไร สมมติว่าใช้ tis-620  browser ก็จะแปลงตัวเลขให้เป็นภาษาไทยแล้วแสดงผลครับ แล้วทีนี้มันก็มีปัญหาว่าหน้าเว็บ 1 หน้าจะไม่สามารถแสดงผลได้หลายภาษา ได้แค่ครั้งละภาษาเท่านั้นเพราะ 1 ไบต์สามารถเก็บได้เต็มที่แค่ภาษาเดียว จึงได้มีคนคิด เรื่อง unicode ขึ้นมาโดยใช้ 2 ไบต์ในการเก็บตัวอักษร 1 ตัว แล้วกำหนดเป็นมาตรฐาน ใช้ชื่อชุดตัวอักษรว่า utf-8 เนื้อที่ 2 ไบต์(บางทีก็มากกว่านั้น แต่จะน้อยมาก)ซึ่งมากมายเกินพอที่จะเก็บอักขระทุกตัวอักษรที่มีบนโลกใบนี้ (เก็บได้ 2ยกกำลัง 16 ตัวอักษร เพราะ 1 ไบต์มี 8 บิต ลองคำนวนดูนะครับว่าได้จริงๆกี่ตัวกันแน่) และสามารถพิมพ์ตัวอักษรภาษาจีน ญี่ปุ่น ไทย ฮ่องกง เยอรมัน ฝรั่งเศส สเปน ฯลฯ ปนกันในหน้าเว็บเดียวกันได้ และต่อไปทำเว็บไซต์ก็ไม่ต้องมาคำนึงปัญหาเรื่องภาษาอีกต่อไป
       นี่คือความแตกต่างกันระหว่าง tis-620 กับ utf-8 ครับ ถ้าเว็บคุณใช้ utf-8 คุณก็ต้องเตรียมใจไว้เลยครับ ว่าเนื้อที่จะเพิ่มขึ้นเป็น 2 เท่า(เฉพาะในส่วนของฐานข้อมูลนะครับ เพราะไฟล์ส่วนใหญ่ก็ยังคงเป็น ascii อยู่ ยกเว้นไฟล์ภาษาที่อาจจะเป็น utf-8 ได้)"

       แต่ทว่าสำหรับภาษาไทยนั้นไม่ได้มีแค่ tis-620 เพียงอย่างเดียวเท่านั้นนะครับ ยังมี character set อื่นๆอีก สำหรับภาษาไทยก็คือ windwos-874,cp874 และ iso-8859-11 ซึ่งที่เรารู้จักกันดีและใช้อยู่ก็จะเป็น tis-620 และ windows-874 ครับ สำหรับ tis-620 นั้นจะเหมือนกับ iso-8859-11 ครับ ซึ่งเป็นมาตรฐานภาษาไทย เพียงแต่ว่าเอามาเรียกอีกชื่อหนึ่งว่า tis-620 เท่านั้นเอง ส่วน windows-874 นั้นจะเป็น super set ของ tis-620 อีกทีเนื่องจากมันทำงานบน ie และทาง microsoft ก็ได้เพิ่มตัวอักษรบางตัวเข้าไปเพื่อให้ได้จำนวนตัวอักษรที่เพิ่มขึ้น ส่วน cp874 ไม่มีให้ใช้ได้เป็นรูปธรรมนะครับ แต่ว่ามันเป็น super set ของ windows 874 อีกที ก็จะมีตัวอักษรที่มากขึ้นอีก แต่ว่ามัน ไม่ใช่มาตรฐาน งงมั๊ยครับ แต่ผมว่าแค่ tis-620 ผมก็ยังใช้งานได้ไม่หมดเลยครับ

       ในเมื่อมันมี utf-8 เกิดขึ้นมา เพราะฉะนั้นมันก็ต้องมีการแปลงจาก asscii codes -> unicode กันหน่อย ซึ่งโดยที่โปรแกรมต่างๆบางโปรแกรมนั้นก็มีฟังก์ชั่นนี้อยู่ในตัวเช่น โปรแกรม Web Browser อย่าง Mozilla Firefox หรือแม้แต่ ie เองก็มี อย่างโปรแกรม Text Edotor บางตัวก็มีครับ เอาง่ายๆ แค่ notepad ธรรมดาๆ เนี่ยล่ะครับ ก็มีเรื่องของการแปลง character set อยู่ สังเกตุได้จากการบันทึกไฟล์ แล้วมันจะมีให้เราเลือกชุดอักขระตัวอักษรที่เราต้องการจะบันทีกครับ  ในภาษา php จะมีฟังก์ชั่นนึงที่ทำการแปลงไปมาระหว่า ascii code กับ unicode(utf-8) ชื่อว่า iconv ก็ลองไปหาใช้ดูนะครับ แต่ว่าจะต้องลง extension เพิ่มเติมก่อน จึงจะใช้งานฟังก์ชั่นนี้ได้ หรือถ้าใครอยากจะเอา class kconvert ของผมไปลองใช้ดูก็ได้นะครับ(ไม่ต้องลงอะไรเพิ่ม แค่เอาคลาสผมไปใช้เพิ่มก็พอ) ข้อดีก็คือ ถ้าผิดพลาด คุณก็แก้ไขเอาเลยครับ เพราะว่ามันเป็นโค้ดภาษา php โหลดได้จากนี่ครับ http://www.sourceforge.net/projects/kconvert

      อาจจะงงกันใช่มั๊ยครับ ว่า เอ๊ะ แล้วเวลามันผิดพลาดเนี่ย ตัวหนังสือมันออกมาเป็นอย่างที่เราเห็นได้อย่างไรกัน สาเหตุมันก็เนื่องจากว่า encoding ของ 1 ใน 3 จุดนี้มันไม่เหมือนกันครับ 3 จุดนั้นก็คือ
1.ฐานข้อมูล
2.ไฟล์บางไฟล์ที่อาจจะมีภาษาไทยปนอยู่ เช่นไฟล์ภาษา
3.การเลือกใช้ character set บนหน้าเว็บ
สมมติ ว่าคุณต้องการใช้ tis-620 ทั้งสามจุดดังกล่าวก็ต้องเป็น tis-620 ให้หมด หรือในอีกทางหนึ่ง ถ้าใช้ utf-8 ทั้งสามจุดก็ต้องเป็น utf-8 ให้หมด ให้เรายึดหลักการอย่างนี้ครับ

(Source Text)=>Process=>(Destination Text)

ไม่ ว่า source จะเป็นอะไร ผ่านการประมวลผลบางอย่าง destination ต้องเป็นอย่างนั้นครับ ถ้าเกิดผิดเพี้ยนไป การแสดงผลจะผิดพลาดครับ ยกตัวอย่างเช่น
การ insert ข้อมูลลงฐานข้อมูล ถ้าเราต้องการใช้ utf-8 จะต้องสร้างฐานข้อมูลให้เป็น utf8 และข้อมูลที่เข้าก็ต้องเป็น utf-8 ครับ ถ้าฐานข้อมูลเป็น utf-8 แต่ข้อมูลเข้าเป็น tis-620 เกิดอะไรขึ้นรู้มั๊ยครับ .... ข้อมูลที่เก็บจะเป็นตัว ?????? ครับผม หรือถ้าในทางกลับกัน ฐานข้อมูลเป็น tis-620 แต่ข้อมูลเข้าเป็น utf-8 ข้อมูลที่เก็บก็จะเป็นตัวหนังสือสี่เหลี่ยมๆๆๆ อาจจะมีสระ เ หรือ  ธ  ปนๆมาบ้าง

สรุปนะครับ ได้ตามนี้ครับ
utf-8=>process=>utf-8 ====>> ตัวอักษรเป็นปกติอยู่ดีกินดีไม่มีผิดเพี้ยน
tis-620=>process=>tis-620 ====>> ตัวอักษรเป็นปกติอยู่ดีกินดีไม่มีผิดเพี้ยน
utf-8=>process=>tis-620 ====>> ตัวอักษรเป็นสี่เหลี่ยม อาจจะมี เ กะ ธ ปนมาด้วย หรืออาจจะมีตัวอื่นๆอีก
tis-620=>process=>utf-8 ====>> ตัวอักษรเป็น ?????

สำหรับ process นี้ผมจะแบ่งคร่าวตามนี้ครับ แต่อาจจะมีอย่างอื่นอีกไม่ได้กล่าวถึง(ไม่ได้อ้างอิงใคร อ้างอิงผมเองครับ)
1.การอ่าน หรือ การเขียนลงฐานข้อมูล หรือ ไฟล์
2.การนำมาแสดงผล ซึ่งการนำมาแสดงผลนี้ ตัว source text อาจจะมาจากฐานข้อมูล หรือ ไฟล์ ผ่านการประมวลผลคือหยิบมาแสดงผล ก็ได้ออกมาเป็น destination text ซึ่งในที่นี้ก็คือ encoding ของหน้าเว็บ ซึ่งจะต้องตรงกับฐานข้อมูลหรือไฟล์ที่เราทำการบันทึกไว้ การแสดงผลจึงจะไม่ผิดเพี้ยน

เป็นไงกันบ้างครับ พอจะเข้าใจบ้างมั๊ยครับ ถ้าไม่เข้าใจหรือว่าข้อมูลของผมผิดเพี้ยนตรงไหน หรือว่าอาจจะเสริมตรงไหน เม้นท์ไว้ได้นะครับ ผมจะได้มาแก้ไขให้ถูกต้อง หรือถ้าสงสัยก็ถามไว้ครับ เดี๋ยวผมมาอธิบายให้กระจ่างอีกที