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