คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 3
> โดยปกติใน Notepad ถ้าเป็นภาษาไทยผมจะเลือกแต่ Unicode
จะว่าไปแล้ว ตัวเลือกนี้ไม่ควรมีครับ เพราะในทางเทคนิคแล้วมันไม่มีความหมาย
Unicode เป็นแค่การกำหนดว่ารหัสตั้งแต่ 0 - 1,114,112 (0x10ffff) แต่ละรหัสใช้แทนตัวอักษรใด เช่น
- 65 (0x0041) คือตัว A
- 97 (0x0061) คือตัว a
- 3585 (0x0e01) คือตัว ก.ไก่
- 3618 (0x0e22) คือตัว ม.ม้า
- 128512 (0x01f600) คือตัวอีโมจิรูปหน้ายิ้ม 😀
ปัญหาก็คือ ปัจจุบันระบบจัดเก็บข้อมูลในคอมพิวเตอร์ยังนิยมใช้แบบ 8 บิต ดังนั้นจึงต้องมีวิธีการจัดเก็บค่าเหล่านี้ลงไป
- วิธีแรกก็ตรงไปตรงมา ในเมื่อ Unicode เป็นรหัส 32 บิต ก็เก็บข้อมูลทีละ 32 บิตลงไปเลย นั่นหมายความว่าข้อมูลแต่ละตัวอักษรก็จะใช้เนื้อที่ 32 บิต หรือ 4 ไบต์ ทำให้ข้อมูลเอกสารที่เป็นตัวอักษรจากเดิมเก็บ 1 ตัวอักษรใช้เนื้อที่ 1 ไบต์ ก็จะใช้เนื้อที่เพิ่มเป็น 4 เท่า จึงทำให้แทบไม่มีการใช้งานวิธีนี้เลย วิธีนี้คือการเก็บข้อมูล Unicode แบบ UTF-32
- วิธีที่สอง เนื่องจากรหัส Unicode ส่วนใหญ๋มีค่าไม่เกิน 65535 ซึ่งพอที่จะใช้เนื้อที่ 2 ไบต์ หรือ 16 บิตเก็บได้ ตัวไหนเกินก็จะใช้รหัสพิเศษในการเก็บเป็น 16 บิต 2 ตัว วิธีนี้คือ UTF-16 ซึ่งสามารถเลือกได้ว่าจะเอาไบต์ไหนก่อนหลังตามประเภทของ CPU และแยกออกเป็น Big Endian (UTF-16BE) และ Little Endian (UTF-16LE)
- วิธีที่สาม คือ UTF-8 เป็นวิธีที่ปัจจุบันมีการใช้งานกันมากที่สุด โดยเป็นการเก็บข้อมูลแบบความยาวไม่คงที่ ตัวอักษรเดิมจาก ASCII จะใช้เนื้อที่เพียง 1 ไบต์ ส่วนตัวอักษรประเภทอื่นก็จะใช้เนื้อที่ 2 - 4 ไบต์โดยจะมีรหัสพิเศษสำหรับระบุว่าตัวอักษรใดจะใช้เนื้อที่กี่ใบต์ ซึ่งสำหรับภาษาไทยจะใช้เนื้อที่ 3 ไบต์
แต่ก็อาจจะเป็นไปได้ว่าที่โปรแกรมบอกว่าจัดเก็บแบบ Unicode นั้น จริง ๆ แล้วคือการเก็บแบบ UTF-8 เพราะเป็น encoding ที่ใช้กันมากที่สุดแล้ว
จะว่าไปแล้ว ตัวเลือกนี้ไม่ควรมีครับ เพราะในทางเทคนิคแล้วมันไม่มีความหมาย
Unicode เป็นแค่การกำหนดว่ารหัสตั้งแต่ 0 - 1,114,112 (0x10ffff) แต่ละรหัสใช้แทนตัวอักษรใด เช่น
- 65 (0x0041) คือตัว A
- 97 (0x0061) คือตัว a
- 3585 (0x0e01) คือตัว ก.ไก่
- 3618 (0x0e22) คือตัว ม.ม้า
- 128512 (0x01f600) คือตัวอีโมจิรูปหน้ายิ้ม 😀
ปัญหาก็คือ ปัจจุบันระบบจัดเก็บข้อมูลในคอมพิวเตอร์ยังนิยมใช้แบบ 8 บิต ดังนั้นจึงต้องมีวิธีการจัดเก็บค่าเหล่านี้ลงไป
- วิธีแรกก็ตรงไปตรงมา ในเมื่อ Unicode เป็นรหัส 32 บิต ก็เก็บข้อมูลทีละ 32 บิตลงไปเลย นั่นหมายความว่าข้อมูลแต่ละตัวอักษรก็จะใช้เนื้อที่ 32 บิต หรือ 4 ไบต์ ทำให้ข้อมูลเอกสารที่เป็นตัวอักษรจากเดิมเก็บ 1 ตัวอักษรใช้เนื้อที่ 1 ไบต์ ก็จะใช้เนื้อที่เพิ่มเป็น 4 เท่า จึงทำให้แทบไม่มีการใช้งานวิธีนี้เลย วิธีนี้คือการเก็บข้อมูล Unicode แบบ UTF-32
- วิธีที่สอง เนื่องจากรหัส Unicode ส่วนใหญ๋มีค่าไม่เกิน 65535 ซึ่งพอที่จะใช้เนื้อที่ 2 ไบต์ หรือ 16 บิตเก็บได้ ตัวไหนเกินก็จะใช้รหัสพิเศษในการเก็บเป็น 16 บิต 2 ตัว วิธีนี้คือ UTF-16 ซึ่งสามารถเลือกได้ว่าจะเอาไบต์ไหนก่อนหลังตามประเภทของ CPU และแยกออกเป็น Big Endian (UTF-16BE) และ Little Endian (UTF-16LE)
- วิธีที่สาม คือ UTF-8 เป็นวิธีที่ปัจจุบันมีการใช้งานกันมากที่สุด โดยเป็นการเก็บข้อมูลแบบความยาวไม่คงที่ ตัวอักษรเดิมจาก ASCII จะใช้เนื้อที่เพียง 1 ไบต์ ส่วนตัวอักษรประเภทอื่นก็จะใช้เนื้อที่ 2 - 4 ไบต์โดยจะมีรหัสพิเศษสำหรับระบุว่าตัวอักษรใดจะใช้เนื้อที่กี่ใบต์ ซึ่งสำหรับภาษาไทยจะใช้เนื้อที่ 3 ไบต์
แต่ก็อาจจะเป็นไปได้ว่าที่โปรแกรมบอกว่าจัดเก็บแบบ Unicode นั้น จริง ๆ แล้วคือการเก็บแบบ UTF-8 เพราะเป็น encoding ที่ใช้กันมากที่สุดแล้ว
แสดงความคิดเห็น
UTF-8 with BOM กับ UTF-16 LE/BE ต่างกันยังไงครับ
บังเอิญจะ Save file ของ Notepad เป็นภาษาไทยครับ แต่เห็นใน Encoding มีให้เลือกแค่ ANSI กับ UTF (8 กับ 16)
โดยปกติใน Notepad ถ้าเป็นภาษาไทยผมจะเลือกแต่ Unicode คราวนี้มีให้เลือก หลายแบบเลยไม่รู้ว่า ถ้าจะ Save เป็นภาษาไทยควรจะเลือกตัวไหนครับ
และ แต่ล่ะแบบ ต่างกันยังไงครับ รบกวนผู้รู้ช่วยอธิบายด้วยครับ