Pages

7/26/2010

Setup ภาษาไทยใน Dev-C++

เพิ่งรู้ว่า C++ มีsupport international characters ด้วย
 
ปกติ C ธรรมดาจะ support ตัวอักษรแบบเดียวคือ char ซึ่งเก็บข้อมูล 1 byte
แต่ C++ นอกจากจะรองรับ char แล้ว ยังรองรับ wchar_t ด้วย ซึ่งเก็บข้อมูล 2 bytes แล้วทำใช้ encoding แบบ Unicode (โดยบน windows (PC)ก็จะเรียงข้อมูลแบบ little-endian เช่น ก.ไก่ = 0x0E01 จะเก็บเป็นแบบ 01, 0E ในตัวแปรประเภท wchar_t)

แต่เนื่องจากระบบ wchar_t นี้ จะใช้การเก็บข้อมูลเป็นแบบ 2 bytes 
ดังนั้นเวลาจะตรวจสอบว่า string อันนี้จบข้อความหรือยัง จะต้องตรวจสอบด้วยว่า มี 0x0000 รึเปล่า นั่นหมายถึงใช้ strlen แบบธรรมดาเช็คไม่ได้ เพราะตัวอักษรจบstringมันยาวเป็น2bytes  ไม่ใช่แค่ไบต์เดียว(\0)แบบที่ strlen แบบปกติ ใช้เช็คว่าจบstringแล้ว

เมื่อฟังก์ชั่นเดิมที่ใช้เกี่ยวกับ string เดิมใช้ไม่ได้ เลยต้องใช้ฟังก์ชั่นที่ใช้งานสำหรับ wchar_t แทน
วิธีการจำง่ายๆ ก็คือ ฟังก์ชั่นไหนเป็นรูปแบบ strxxx(...) ก็ให้เปลี่ยนเป็น wcsxxx(...) แทน (wcs น่าจะมาจากคำว่า wide-character string)

วิธีการใช้งานภาษาซีให้ใช้ภาษาไทยได้

1. ใส่สองบรรทัดนี้ ไว้บนสุดของโค้ด
#define UNICODE
#define _UNICODE
2. จากเดิมที่ประกาศตัวแปรเป็น char* หรือ char[ ] ให้เปลี่ยนเป็น wchar_t* หรือ wchar_t[ ]
3. เขียน L นำหน้า ค่าคงที่string 
เช่น
wchar_t [ ] data = L"Hello World";
4. เปลี่ยนไปใช้functionที่รองรับ wchar_t
เช่น
wcslen(..), wcscpy(..), swprintf(..), _wtol(...)

และเพื่อให้ผู้พัฒนาโปรแกรมได้เขียนโปรแกรมได้ความสะดวกยิ่งขึ้น โดยไม่ต้องสลับไปสลับมาระหว่าง char, wchar_t 
ทางคนคิด compiler ของ C++ จึงสร้างตัวแปรแบบพิเศษขึ้นมาเพื่อให้เราเรียกใช้สามารถเปลี่ยนระหว่าง char กับ wchar_t 
เพียงการใส่ #define UNICODE , #define _UNICODE เอง

หมายถึงว่า เมื่อไหร่ที่ต้องการให้โค้ดทั้งหมด ใช้งานตัวอักษรแบบ Unicode ก็ให้ใส่สองบรรทัดนี้
แต่ถ้าต้องการให้โค้ดทั้งหมด ใช้งานเป็นแค่ char ธรรมดา(1 byte) ก็แค่เอา สองบรรทัดนี้ออก

แต่ปัญหาอยู่ที่ว่า เนื่องจาก Compiler มีผู้ผลิตหลายเจ้าทั้ง VC, GNU, MingW32 
ตัวแปรชนิดนี้เลยมีขึ้นมาหลายชื่อ เช่น LPCTSTR , TCHAR เป็นต้น

REF: http://www.codeproject.com/KB/string/cppstringguide1.aspx

DEV-C++
ก่อนที่จะเริ่มเขียนภาษาไทยลงไปในโค้ดภาษาซีได้
เราจะต้องตั้งค่าให้ตัว editor ของ dev-c++ ที่ใช้ในการเขียนโค้ด รองรับแสดงผลแบบภาษาไทยก่อน 
(ไม่งั้นพิมพ์ไทยออกมาบนนั้น กลายเป็นตัวยึกยือแน่ๆ)

วิธีการก็คือ ทำได้โดย
1. การตั้ง font ให้เป็น courierMonoThai หาโหลดได้ทั่วไปในinternet
2. ต้องตั้งค่าให้ compiler ของdev-c++ จากเดิมเป็น gcc.exe, g++.exe, make.exe, ... ให้ใช้เป็น mingw32-gcc.exe, mingw32-g++.exe, mingw32-make.exe

ถึงแบบนั้นแล้วก็ยังไม่พอ เพราะถ้า compile ด้วยวิธีนี้แล้ว
จะยังขึ้น error ว่า "illegal byte sequence"
3. ต้องใส่ option ตอน compile ว่า -finput-charset=tis620 ด้วย  หมายถึงว่าไฟล์โค้ดCนี้ถูกจัดเก็บด้วยการเข้ารหัส(encoding)แบบ TIS-620 ตัวคอมไพล์เลอร์จะได้ตีความถูก
4. หลังจากsetup ตัวeditor ให้พิมพ์ภาษาไทยได้แล้ว.. เวลา dev-c++ จะจัดเก็บsource code ก็ต้องสั่งให้มันจัดเก็บโค้ด .c ของเราให้เป็นชนิด TIS-620 ด้วย (แทนที่จะเก็บแบบ ascii แบบปกติ) 

**หมายเหตุ
หา option ที่ทำให้มันเก็บแบบ Unicode ไม่เจอ, และถ้าเอา fileแบบ unicode มาเปิดใน dev-c++ มันก็อ่านไม่ออก  เลยต้องใช้เป็นแบบ TIS620 แทน




Edited: Feb 21,2011 เพื่อให้มันอ่านออกง่ายขึ้น

2 comments:

  1. เว็บดาวโหลดโปรแกรม Dev C++ พร้อมวิธีติดตั้งอย่างละเอียดครับ http://devcppbyc.blogspot.com/2016/02/dev-c.html

    ReplyDelete
  2. ตามขั้นตอน ตาม link นี้จะต้อง setup อะไรเพิ่มเติมอีกไหมครับ ให้รองรับภาษาไทย ถ้าติดตั้งใน Window 8.1 64 bit และต้องใช้ font อะไรหรือครับ ของผมที่ download จากต้นตอโดยตรงมีปัญหากับภาษาไทย

    ReplyDelete