แนะนำ การใช้งาน 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 นะครับ