หลายๆคนอาจจะสังสัยครับ เรื่อง 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
ของหน้าเว็บ ซึ่งจะต้องตรงกับฐานข้อมูลหรือไฟล์ที่เราทำการบันทึกไว้
การแสดงผลจึงจะไม่ผิดเพี้ยน
เป็นไงกันบ้างครับ พอจะเข้าใจบ้างมั๊ยครับ
ถ้าไม่เข้าใจหรือว่าข้อมูลของผมผิดเพี้ยนตรงไหน
หรือว่าอาจจะเสริมตรงไหน เม้นท์ไว้ได้นะครับ ผมจะได้มาแก้ไขให้ถูกต้อง
หรือถ้าสงสัยก็ถามไว้ครับ เดี๋ยวผมมาอธิบายให้กระจ่างอีกที
เกี่ยวกับเรื่อง character set และ utf-8 กะ tis-620
เกี่ยวกับเรื่อง character set และ utf-8 กะ tis-620
ความเห็น
บทความในวันเดียวกัน
nutchanat - puttawiro · 24 พ.ค. 2551
กิตติพันธ์ · 24 พ.ค. 2551
mitrsomwang · 24 พ.ค. 2551
pensiri ngamjit · 24 พ.ค. 2551
แล้วของเล็กอ่ะมันจะแกยังไงอ่ะ
ในฐานข้อมูล เป็นตัวขยึกขยึย
แต่ตอน 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 คืออะไร
เข้าง่าย เข้าใจครับ #ขอบคุณครับ