# มาตรฐานระบบภาษาไทย

ปัจจุบันมาตรฐานระบบภาษาไทยที่ใช้กันอยู่และได้รับการยอมรับ จะเป็นมาตรฐานจาก
กระทรวงอุตสาหกรรม ซึ่งจะประกอบด้วยมาตรฐานดังต่อไปนี้
ซึ่งมาตรฐานเหล่านี้คุณจะหาอ่านได้จากเวปไซต์ของทาง NECTEC และนอกจากมาตรฐาน
เหล่านี้แล้วยังมีมาตรฐานเกี่ยวกับอุตสาหกรรมด้านอื่นๆอีกด้วย

- มอก.820-2538 การกำหนดตำแหน่งอักขระไทยบนแป้นพิมพ์คอมพิวเตอร์
- มอก.620-2533 รหัสสำหรับอักขระไทยที่ใช้กับคอมพิวเตอร์
- มอห.988-2533 ข้อแนะนำเกี่ยวกับรหัสสำหรับอักขระไทยผสม และสัญลักษณ์สำหรับการ
  ตีตารางสำหรับเครื่องพิมพ์แบบจุด (dot matrix)
- มาตรฐานซอฟต์แวร์สำหรับภาษาไทย วทท. ๒.๐ (Thai Language Software Standard
  WTT 2.0)

สำหรับ Linux Thai Project จะใช้มาตรฐานข้างต้นเป็นแนวทาง โดยเฉพาะมาตรฐาน
จาก วทท. ๒.๐ ซึ่งในที่นี้จะสรุปบางส่วนโดยย่อ หากคุณสนใจมาตรฐาน วทท. ๒.๐ ฉบับ
เต็มขอให้หาอ่านจากหนังสือ "คอมพิวเตอร์กับภาษาไทย : การพัฒนามาตรฐานเบื้องต้น
สำหรับเทคโนโลยีสารสนเทศของไทย" โดย ดร.ทวีศักดิ์ กออนันตกูล และคณะทำงานร่าง
ข้อกำหนดร่วมเพื่อการเขียนโปรแกรมซึ่งแสดงผลเป็นภาษาไทย (Thai API Consortium)
จัดพิมพ์โดย NECTEC
สรุปย่อบางส่วนจากมาตรฐาน วทท. ๒.๐

### ภาคคำศัพท์ทั่วไป

- ระดับการจัดวางอักขระแบ่งเป็น 5 ระดับคือ ระดับไม่แสดงผล (NONDISP)
  ระดับบนสุด (TOP) ระดับบน (ABOVE) ระดับฐาน (BASE) และระดับล่าง(BELOW)
- Dead character หรือตัวหยุด คือสระบน สระล่าง วรรณยุกต์ และเครื่องหมายกำกับ
  เสียงที่อยู่บนหรือใต้พยัญชนะต่างๆ เมื่อถูกแสดงผล ตำแหน่งของเคอร์เซอร์จะไม่
  เลื่อนไปทางขวา
- เซลล์แสดงผลภาษาไทย (Thai display cell) คือหน่วยแสดงผล 1 หน่วยที่อาจจะประกอบ
  ด้วยสัญลักษณ์ภาษาไทยจำนวนตั้งแต่ 1-3 สัญลักษณ์ ประสมอยู่ในตำแหน่งแสดงผลเดียว
  กันแต่ต่างระดับ ตามอักขระวิธีที่กำหนดในมาตรฐาน คุณสมบัติของเซลล์หรือช่องแสดง
  ผลภาษาไทย จะถูกบรรยายโดยข้อมูลซึ่งมีโครงสร้างเป็น THAI_CELL
- สายอักขระ (character string) ได้แก่ array ของอักขระในหน่วยความจำของเครื่อง
  คอมพิวเตอร์หรือเทียบเท่า โดยมีการจัดอักขระที่เรียงกันไบต์ละ 1 ตัว และเข้ารหัส
  ตาม มอก.620-2533 อย่างเคร่งครัด กล่าวคือ สระบน สระล่าง หรือ พยัญชนะ ต่างก็
  ถูกเก็บในหน่วยความจำแบบแยกกันตัวละ 1 ไบต์ สายอักขระชุดหนึ่งสิ้นสุดลงเมื่อพบ
  อักขระทีี่มีรหัส 0 (NULL character) หรือ ASCIIZ
- ความยาวของสายอักขระ (string length) คือจำนวนตัวอักขระในสาย ไม่นับ NULL
  character นับรวมทั้งสระบน สระล่าง วรรณยุกต์ และเครื่องหมายกำกับเสียง
- ความกว้างของสายอักขระ (string width) คือจำนวนช่องหรือเซลล์ที่ระบบแสดงผลตาม
  อักขรวิธีภาษาไทยสำหรับคอมพิวเตอร์ ต้องใช้แสดงสายอักขระสายนั้น (ไม่นับรวมสระบน
  สระล่าง วรรณยุกต์ และเครื่องหมายกำกับเสียง)
- น้ำหนักของเซลล์แสดงผล (cell weight) ได้แก่ จำนวนสัญลักษณ์ที่ปรากฏในเซลล์แสดงผล
  1 เซลล์มีค่าตั้งแต่ 1 ถึง 3 เช่น
  เซลล์ สู้ มีน้ำหนักเป็น 3
  เซลล์ ปี มีน้ำหนักเป็น 2

### ภาคข้อตกลงเกี่ยวกับการเรียกชื่อต่างๆ (API naming convention)

- ตัวแปรแวดล้อม (environment variables) ต้องใช้สัญลักษณ์ภาษาอังกฤษล้วน และเป็น
  ตัวใหญ่ (capital letters) ทั้งหมด นำหน้าด้วย TAC_
- ค่าคงที่ (constants) ใช้สัญลักษณ์ภาษาอังกฤษล้วน และเป็นตัวใหญ่ทั้งหมด นำหน้า
  ด้วย TAC_ เช่นเดียวกับตัวแปรแวดล้อม แต่อนุโลมให้ละคำว่า TAC_ ได้ในการปฏิบัติ
  ที่ผู้ใช้แน่ใจว่า ไม่ก่อให้เกิดความกำกวม ตัวอย่างเช่น การกำหนดค่ารหัสมาตรฐาน
  ในไฟล์ TIS.H ได้กำหนดค่าคงของ ค ควาย ให้เป็น

            #define TAC_KHOKHWAI    164

  สามารถกำหนดเป็น #define KHOKHWAI 164
- ประเภทของข้อมูล (data types) ใช้สัญลักษณ์อังกฤษล้วน และเป็นตัวใหญ่ทั้งหมด ไม่
  มีการนำด้วยเครื่องหมายใดๆ เช่น CRT_INFO, THAI_CELL เป็นต้น โปรดสังเกตว่าการ
  แยกย่อยใช้สัญลักษณ์ underscore (_) เป็นตัวแยก นอกจากนี้ประเภทของข้อมูลระดับต่ำ
  (primitive data type) และโครงสร้างข้อมูลระดับต่ำ หากเขียนเป็นภาษา C ให้ยึด
  ถือตามข้อกำหนดต่อไปนี้ด้วย

      #define CHAR     char
      #define SHORT    short
      #define LONG     long
      #define INT      int

      typedef unsigned char   UCHAR;
      typedef unsigned short  USHORT;
      typedef unsigned long   ULONG;
      typedef unsigned int    UINT;
      typedef unsigned short  BOOL;

      typedef unsigned char   BYTE;
      typedef unsigned int    WORD;
      typedef unsigned long   DWORD;

- ฟังก์ชั่นมาตรฐานเกี่ยวกับอักขรวิธีและสายอักขระภาษาไทย (Thai Output and String
  API) ให้นำชื่อฟังก์ชั่นด้วย TAC และตามด้วยชื่อของฟังก์ชั่นที่ตั้งขึ้นตามกติกา
  ต่างๆดังนี้
  string function ใช้สูตรการตั้งชื่อว่า s<act> หรือ sn<act> เช่น TACswid
  conversion function ใช้สูตรการตั้งชื่อว่า <i>to<o> เช่น TACttod
  character test function ใช้สูตรการตั้งชื่อว่า is<what> เช่น TACiscons
  โดย <act> หมายถึง action หรือสิ่งที่จะคำนวณหรือทำ เช่น swid เป็นการหา string
  width ตามวิธีของภาษาไทย <i> และ <o> หมายถึง input data และ output data
  ตามลำดับ <what> เป็นคำถามว่าอักขระเป็นประเภทนี้หรือไม่ เช่น iscons เป็นการตรวจ
  สอบว่าอักขระที่เป็น parameter เป็นพยัญชนะหรือไม่
  โดยปกติการเรียกชื่อฟังก์ชั่นต่างๆ ให้เรียกด้วยชื่อเต็มเสมอ แต่ในกรณีที่มีความประ
  สงค์จะเรียกเป็นชื่อย่อ ให้จัดทำ header file เพิ่มเติม เพื่อใช้ในการขยายชื่อย่อ
  ให้กลายเป็นชื่อเต็ม การย่อให้ละ TAC ที่นำหน้าออกไป
- ฟังก์ชันประเภทจอภาพ + แป้นพิมพ์ และเครื่องพิมพ์ (Display/Keyboard API and
  Printer API) ฟังก์ชั่นเหล่านี้ให้นำหน้าด้วย TAC จากนั้นตามด้วย v (จอภาพ) หรือ k
  (แป้นพิมพ์) หรือ p (เครื่องพิมพ์) และสัญลักษณ์ซึ่งมีความหมายตามสูตรต่อไปนี้
  1. <noun> หรือ <data structure> เช่น
     TACvbox วาดกรอบบนจอแสดงผล
     TACvxyas เขียน string ณ ตำแหน่ง x,y บนจอแสดงผลโดยใช้สี a ที่กำหนดให้
     TACkstate ถามสถานะของแป้นพิมพ์
     TACpstring พิมพ์ string ออกทางเครื่องพิมพ์
  2. <verb> ใช้สั่งเปลี่ยนสถานะของสิ่งต่างๆหรือกระทำการบางสิ่งบางอย่าง เช่น
     TACkread อ่านข้อความเข้ามาทางแป้นพิมพ์
     TACpcompose สั่งให้เริ่มการพิมพ์ภาษาไทยแบบจัดระดับ
  3. <verb><noun> ใช้สั่งกระทำการอะไรบางอย่างเช่น
     TACvmoverect ย้ายช่องสีี่เหลี่ยมบนจอภาพ
     TACkgetshift สอบถามค่า shift ต่างๆในระบบแป้นพิมพ์
     TACpgetinfo สอบถามคุณสมบัติของเครื่องพิมพ์

### การตรวจสอบความถูกต้องของการป้อนข้อมูล

แบ่งเป็น 3 ระดับ คือ

- การตรวจสอบระดับ 0
  ระงับการตรวจสอบความถูกต้อง (passthrough) เพื่อให้โปรแกรมประยุกต์ เป็นผู้
  ตรวจสอบเองทั้งหมด แต่เมื่อเสร็จสิ้นการทำงานแล้วโปรแกรมจะต้องเปลี่ยนระดับ
  การตรวจสอบกลับเป็นสภาพปกติ (ระดับ 1)
- การตรวจสอบระดับ 1
  การตรวจสอบขั้นพื้นฐาน เช่นการป้อน เกาะ จะต้องป้อน เ-ก-า-ะ ตามลำดับ
  หรือการป้อน ที่ จะต้องป้อนเป็น ท - ี - ่ และระงับการป้อน ท - ่ - ี
- การตรวจสอบระดับ 2
  เป็นการตรวจสอบที่เคร่งครัดขึ้น โดยใช้เงื่อนไขทางตรรกของภาษาไทยมากำหนด
  เพิ่มเติมจากการตรวจสอบในระดับที่ 1

### การตรวจแก้ข้อความ

- forward cell เป็นการเคลื่อนเคอร์เซอร์ไปทางขวาทีละเซลล์
  (ใช้ปุ่มลูกศรไปทางขวา)
- backward cell เป็นการเคลื่อนเคอร์เซอร์ไปทางซ้ายทีละเซลล์
  (ใช้ปุ่มลูกศรไปทางซ้าย)
- delete current cell ลบอักขระในเซลล์ที่มีเคอร์เซอร์อยู่ครั้งละหนึ่งเซลล์
  (ใช้ปุ่ม delete)
- *(delete next cell) (ไม่สนใจว่ามีกี่อักขระในเซลล์นั้น)
- delete previous char ลบอักขระในเซลล์ที่อยู่ทางซ้ายมือของเคอร์เซอร์ไปครั้งละ
  หนึ่งอักขระ (ใช้ปุ่ม Backspace)

HTML developed by Kaiwal Development Team (kaiwal@geocities.com)