February 14, 2013

การเข้ารหัสตัวอักษรไทย แบบ ANSI, Unicode และ UTF-8

หากเราสร้างไฟล์ที่มีภาษาไทยด้วย Notepad
แล้วสั่งบันทึก หรือสั่ง Save As จะมีถามให้เลือก Encoding 4 แบบ
-ANSI
-Unicode
-Unicode big endian
-UTF-8
แล้วเราควรจะเลือกแบบไหน?
มาลองดูกันครับ



ANSI คือการบันทึกแบบ 8 บิต ทั้งไทยและอังกฤษ ดังนั้นผู้นำไฟล์ไปใช้ (แสดงบนจอ) จะต้องรู้ว่าตัวอักษรที่สูงกว่า 80h คือภาษาไทย โดยจะใช้ TIS-620 หรือ Windows-874 ก็ได้
เช่น "ABC กขค" จะบันทึกเป็น
41 42 43 20 A1 A2 A4

Unicode คือการบันทึกแบบ 16 บิต ต่อตัวอักษร หรือ UTF-16 (กรณีภาษาอังกฤษและไทย แต่บางภาษาอาจใช้ 32 บิต)
เช่น "ABC กขค" จะบันทึกเป็น
FF FE 41 00 42 00 43 00 20 00 01 0E 02 0E 04 0E
ค่า FF FE ที่อยู่ต้นไฟล์ คือ BOM (Byte order mark) ของ Unicode UTF-16 สำหรับบอกว่า รหัส Unicode ที่ตามมานั้น จะเรียงโดย ไบต์ต่ำมาก่อน (Little Endian = LE) โปรแกรมทั่วไปสามารถใช้ BOM นี้ในการบอกได้ว่าไฟล์นี้เป็นแบบ UTF-16 (LE)

Unicode Big Endian คือการบันทึกแบบ  UTF-16 แต่เรียงไบต์สูงมาก่อน (Big Endian )
เช่น "ABC กขค" จะบันทึกเป็น
FE FF 00 41 00 42 00 43 00 20 0E 01 0E 02 0E 04
ค่า FE FF ที่อยู่ต้นไฟล์ คือ BOM ของ UTF-16 ((Big Endian =BE)

UTF-8 คือการบันทึกอักษรอังกฤษ เป็นแบบ 8 บิต และบันทึกอักษรไทยแบบ 24 บิต (3 ไบต์) ซึ่งตัวอักษรอังกฤษถูกต้องเสมอในโปรแกรมที่ทำงานแบบ 8 บิต ส่วนภาษาอื่นต้องถอดรหัสเอง
เช่น "ABC กขค" จะบันทึกเป็น
EF BB BF 41 42 43 20 E0 B8 81 E0 B8 82 E0 B8 84
ค่า EF BB BF ที่อยู่ต้นไฟล์ คือ BOM ของ UTF-8 แต่ใน UTF-8 ค่านี้ไม่มีผล เพราะเรียงข้อมูลเป็นแบบไบต์อยู่แล้ว โปรแกรมทั่วไปสามารถใช้ BOM นี้ในการบอกได้ว่าไฟล์นี้เป็นแบบ UTF-8

2 comments:

  1. อยากเซฟไฟล์ภาษา เยอรมัน แบบ ANSI ทำได้ไหมครับ ลองเซฟแล้วตัวอักษรแปลกๆ มันขึ้นเป็น ???

    ReplyDelete
  2. BEGIN:VCARD
    VERSION:2.1
    N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E0=B9=81=E0=B8=A1=E0=B9=88=E0=B9=82=E0=B8=81=E0=B8=AB=E0=B8=81;;;
    FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E0=B9=81=E0=B8=A1=E0=B9=88=E0=B9=82=E0=B8=81=E0=B8=AB=E0=B8=81
    TEL;CELL:065-862-7199
    END:VCARD

    ReplyDelete