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


เกี่ยวกับเรื่อง 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 ของหน้าเว็บ ซึ่งจะต้องตรงกับฐานข้อมูลหรือไฟล์ที่เราทำการบันทึกไว้ การแสดงผลจึงจะไม่ผิดเพี้ยน

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

คำสำคัญ (Tags): #character set#encoding#tis-620#utf-8
หมายเลขบันทึก: 184298เขียนเมื่อ 24 พฤษภาคม 2008 16:31 น. ()แก้ไขเมื่อ 23 มิถุนายน 2012 20:14 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (7)
น้องเล็ก น่ารักจิงๆ

แล้วของเล็กอ่ะมันจะแกยังไงอ่ะ

ในฐานข้อมูล เป็นตัวขยึกขยึย

แต่ตอน create database ก็ตั้งเป็นutf8แล้วนะ

หน้าที่เขียนเวปก็ตั้งนะ แต่ทำไมในฐานข้อมูลก็ยังยึกหยึยอ่ะ

แต่เรียกจากฐานข้อมูลมาแสดงผลหน้าเวปมันก็ปกตินะ

ก็ตอนที่น้องเล็กเห็นว่ามันขยึกขยึ๋ย น้องเล็กดูจากอะไรล่ะ ก็แสดงว่าเป็นที่ตัวนั้นแหละครับที่ไม่ได้แสดงผลเป็น utf8 และก็ไม่ได้แสดงผลเป็น tis620 แต่อาจจะแสดงผลเป็น latin ก็เลยออกมาเป็นขะยึกขะหยึ๋ย

ขอถามหน่อยนะคะ คือว่า ในฐานข้อมูล เก็บเป็น utf8_general_ci น่ะค่ะ แล้วในหน้าโค๊ดของ php ที่จะ insert ข้อมูลลงฐานข้อมูลน่ะค่ะ ก็เซตเป็น utf-8 แล้วตอนแสดงข้อมูลก็เป็นปกติ แต่จะมีบางคำที่มีกล่องสี่เหลี่ยมแทรกเข้ามาด้วยค่ะ ส่วนมากจะอยู่ท้ายข้อมูล ต่อจากข้อมูลเลยค่ะ มันจะต้องแก้ไขยังไงคะ

เนื่องจากว่า utf-8 นั้น โดยส่วนใหญ่ 1 ตัวอักษร จะใช้ 3 ไบต์ ซึ่งถ้าเป็น tis-620 ก็จะเท่ากับ 3 ตัวอักษร เพราะปกติ tis-620 นั้น 1 ตัวอักษร ก็จะใช้แค่ไบต์เดียว เพราะฉะนั้นคำถามที่คุณแบ๋มถามนั้น โดยส่วนใหญ่แล้วจะเป็นที่ท้ายข้อมูล และรองลงมาก็จะเป็นที่ต้นข้อมูล เกิดจากจำนวนไบต์ของตัวอักษรมันไม่ครบ 3 ก็เลยแสดงผลออกมาไม่ถูกต้อง วิธีแก้ก็ขึ้นอยู่กับที่มาของข้อมูลนั้น ถ้าเกิดว่ามาจากการตัดสตริงด้วย substr ของ php หรือฟังก์ชั่นอื่นๆที่เกี่ยวข้องกับสตริง ก็ให้ใช้ iconv ที่เป็น utf-8 แทน iconv นั้นจะมีฟังก์ชั่นเบื้องต้นที่ใช้ดำเนินการเกี่ยวกับสตริงได้ ลองหาข้อมูลเพิ่มเติมเกี่ยวกับ iconv ดุได้ครับ จะยกตัวอย่างนะครับ เกี่ยวกับการตัดสตริง อย่างเช่น ปกติเราใช้

substr( $str, 0, 10);

เป็นการตัดเอา 10 ตัวอักษรแรกของคำ ก็ให้เปลี่ยนมาใช้แบบนี้แทนครับ

iconv_substr( $str, 0, 10, "UTF-8" );

อ้อ ลืมบอกไปอีก 1 เรื่องครับ ทั้งนี้ทั้งนั้น ก็ขึ้นอยู่กับว่าเราได้เปิด iconv ด้วยหรือเปล่าครับ ถ้าเครื่อง server ที่เราใช้งานเปิด iconv ไว้ เราก็จะสามารถใช้ได้ครับ

ข้อแตกต่างระหว่าง Character Set กับ Character Encoding

 7-Bit Encoding คืออะไร

8Bit Encoding คืออะไร

เข้าง่าย เข้าใจครับ #ขอบคุณครับ

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท