Archive

Archive for June, 2010

แนะนำ การใช้งาน String ใน C++ Win32 – Charater Encodings

ท่านครับ เป็นเรื่องปวดหัวเป็นอย่างยิ่งที่เรา จะต้องแก้ปัญหา เรื่อง ความหลากหลายทางพันธุกรรมของ ข้อมูล string  ที่ใช้งานอยู่ใน c++ ไอ้กระผม ก็รู้จักเพียงอย่างเดียวว่า ข้อมูลแบบ string ก็คือ char * ( array ของ character นั่นเอง ตบท้ายด้วย  ‘\O’ ) เท่านั้น  ต่อมามันรู้สึกว่า ไม่พอเสียแล้ว เวลาไปแก้ปัญหา โปรแกรม ที่มี แบบข้อมูล string ชนิดอื่น ก็ เลยไม่เข้าใจ มึนงง และ หาทางออกไม่ได้ ก็เลยต้อง มานั่ง ศึกษาสักนิดให้เข้าออกเข้าใจ แล้วก็เอามาแบ่งปัน ให้กัน ท่านทั้งหลาย “

มาปูพื้นกันก่อน นะครับ  มาทำความรู้จักกับ  ASCII   DBCS  Unicode

เนื่องจากว่า  string ในแบบของ C-style นั้น มันก็คือ arrays ของ characters  ก็หมายความว่าเราก็ควรที่จะรู้จัก characters กันให้ถ่องแท้ซะก่อน  เขาบอกว่า characters นั้นมีการแบบเข้ารหัส (characters encoding schemes ) 3 แบบ และ ก็แบบของข้อมูลอยู่ 3 ชนิดเช่นเดียวกัน ครับ

character encoding scheme อันแรกก็คือ single-byte character set หรือ SBCS ในการเข้ารหัสแบบนี้ หนึ่ง character ต่อหนึ่ง byte พอดิบพอดีไม่เกินนั้น  ตัวอย่างเช่น  การเข้ารหัสแบบ ASCII ไงครับ   และการปิดท้าย string ของ SBCS ก็ใช้ single zero byte.

character encoding scheme ถัดไปก็คือ multi-byte character set หรือ MBCS ครับ การเข้ารหัสแบบนี้ บาง character ก็มีความยาว 1 byte บาง character ก็มีความยาวมากกว่า 1 bytes   MBCS ที่ใช้ใน Windows มี อยู่ 2 ชนิดคือ
single-byte characters และ double-byte characters   และเรามักจะ  double-byte characters set หรือ DBCS แทน MBCS เนื่องจากว่า multi-byte character ที่ยาวที่สุดที่ใช้ใน windows นั้น ยาวเท่ากับ 2 byte นั่นเอง

ข้อมูลเพิ่มเติมของ DBCS encoding   ข้อมูลบ้างส่วนจะถูก reserved ไว้สำหรับการกำหนดว่า  มันคือ double-byte character เช่น การ encoding แบบ Shift-JIT ( ใช้กับภาษา ญี่ปุ่น ) จะมีค่า  0x81-0x9F และ 0xE0-0xFC หมายถึง นี่คือ double-byte character และข้อมูลถัดจากนี้ไป เป็นข้อมูลของ character นี้  ครับ  ค่าดังกล่าวเราเรียกว่า lead bytes และ จะมากกว่า 0x7F เสมอ  ข้อมูลที่ถัดจาก lead byte เรียกว่า trail byte  และ ข้อมูลในส่วนนี้เป็นค่าอะไรก็ได้ที่ไม่ใช่ 0 หรือ none-zero value  และก็เช่นเดียวกันกับ SBCS   string ของ DBCS นั้น จบด้วย single zero byte

character encoding แบบสุดท้าย ก็คือ Unicode  -unicode เป็นมาตรฐานการ เข้ารหัสที่ ทุก characater แทนด้วยข้อมูล ขนาด 2 byte ครับ  บางที่เราก็เรียก Unicode ว่า Wide characters เพราะมันกว้างกว่า single-byte characters ครับ ก็มันกว้างกว่า ก็เท่านั้น เอง และมันก็ไม่เหมือน กัย MBCS เนื่องจากว่า ใน การแทนข้อมูลของ MBCS นั้นสามารถแทนได้ด้วย 1 byte ก็ได้ 2 byte ก็ได้ นั่นเอง   ส่วนการจบท้ายอขง Unicode string ใช้  two zero bytes

ตัวอย่างของการใช้งานของแต่ละชนิดก็อย่างเช่น  Single-byte characters ใช้แทนข้อมูล ตัวอักษร Latin   ตัวอักษรที่ใช้กำหนด accented และ ตัวอ้กษร graphics    แบบ encoding ที่เรารู้จัก ก็อย่างเช่น ASCII และ DOS Operating system.   ส่วน Double-byte characters นั้นใช้กับภาษา ของประเทศในแถบ เอเชียตะวันออก และ ตะวันออกกลาง  และสุดท้าย Unicode ใช้ใน COM  และใช้ใน Windows NT.

ที่แน่ ๆ นะครับเรารู้จักคุ้นเคยกับ single-byte characters อยู่แล้ว  เวลาเราเขียนโปรแกรม เรียกใช้ char  หมายถึงคุณกำลังดำเนินการับ single-byte character ครับ ส่วน double-byte เราก็ประกาศด้วย char เช่นเดียวกัน ส่วน Unicode นั้น เราแทนเด้วย wchar_t และ  ตัวอักษร และ string literals  แบบ Unicode  ให้นำหน้าด้วย L เช่น ตัวอย่าง

wchar_t wch = L’1′;                 // ใช้ 2 bytes

wchar_t wsz = L”Hello”;         //  10 bytes + 2 bytes ( two zero bytes – to terminate the string )

การใช้งาน functions ที่กัดการเกี่ยวกับ String – ( string handling function )

อย่างที่ได้เคยรู้จัก C string functions เช่น strycpy()  sprintf()  atol()  ฟังก์ชันเหล่านี้ เราใช้กับ single-byte string เท่านั้นนะครับ อย่างไรก็ตาม ใน standard library ก็ยั้งได้จัด function ในการทำงานลักษณะเดียวกัน ให้กับ Unicode string เช่น wcscpy()  swprintf() _wtol()

เอาไว้เท่านี้ก่อนดีมั่ยครับ เอาเป็นไปต่อกันในตอนนที่ 2 นะครับ

s_teerapong2000@yahoo.com  http://www.sssolution.net

Categories: C++