ไปที่เนื้อหา


รูปภาพ

เกี่ยวกับการแปลง ascii (ansi) char -> unicode


  • กรุณาลงชื่อเข้าใช้เพื่อตอบกระทู้
มี 3 โพสต์ตอบกลับกระทู้นี้

#1 X CroSs

X CroSs

    Truebot Co-Developer

  • Root Administrator
  • 102427 โพสต์
  • Gender:Male

โพสต์เมื่อ 27 April 2007 - 07:27:00 PM

ในที่นี้ผมต้องการเขียนโปรแกรม แกะข้อมูลของเกมส์ๆนึงขึ้นมา แล้วต้องการ save เป็น .txt แบบ unicode
ก่อนหน้านี้ผมได้ลองอ่านและเขียนแบบ text ไฟล์ธรรมดา ปรากฎว่า คำว่า เตียวก๊ก (ในภาษาจีน) จะมีข้อมูล 4 bytes
ซึ่งน่าจะเป็น 2 ตัวอักษร ของจีน (B1 69 A8 A4) ซึ่งพอ save ลง text ไฟล์ พอเปิด ใน notepad ด้วย thai region ปกติ
มันจะออกมาเป็น ฑiจค ซึ่งถ้าเป็น Chinese region มันก้อจะเป็นภาษาจีนที่ถูกต้อง

ทีนี้ผมต้องการ จะให้มันเก็บ ตัวอักษรจีนนี้เป็น unicode เลย ผมเลยสั่ง StrConv(strTemp, vbUnicode) ผลที่ได้คือ
มันได้เป็น ฑiจค แบบ unicode (8byte) แทน - -*

ใครพอจะมีวิธี หรือ ตัวอย่าง ประมาณนี้บ้างมั้ยครับ ?

ขอบคุณมาก ^^

ปล. เตียวก๊ก = 张角 = 205F D289 (uni)

ปล2. จุดประสงค์จริงๆคือจะ save ลง text file ในรูปแบบ unicode ซึ่งจะได้ทั้งชื่อ ไทย และ จีน โดยสามารถนำไปดูกับเครื่องไหนก้อได้นั่นเอง

ts.gif

manutd18wm.png


#2 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 28 April 2007 - 01:55:36 AM

B1 69 A8 A4
จากตัวเลขที่ให้มา เป็นภาษาจีนที่เข้ารหัส แบบ Big5
ซึ่งใช้ในไต้หวัน ฮ่องกง มาเก๊า

พอคุณเข้ารหัสด้วย
StrConv(strTemp, vbUnicode)
ผมก็สงสัย ฟังก์ชันนี้ทำงานอย่างไร(เนื่องจากความรู้เรื่อง vb มีเท่าหางอึ่ง)
ที่สงสัยคือ มันเข้ารหัสอะไร
เพราะ unicode มีการเข้ารหัสหลายแบบ ที่คุ้นเคยและน่าจะรู้จักกันก็คือ UTF-8
แหล่งที่ไป ก็ต้อง msdn แล้วผมก็ได้คำตอบ(มั้ง) เขาว่า ดังนี้

vbUnicode = Converts the string to Unicode using the default code page of the system.


เหอๆ แล้วมันเข้ารหัสแบบไหนเล่า เฮียเกต
ผมก็เลยต้องดูคำว่า unicode ในความหมายของ msdn เขาว่าไง

Unicode <definition>
Unicode

A character-encoding scheme that uses two bytes to represent every character regardless of
whether it's an ASCII character. This scheme is capable of encoding all known characters and
is used as a worldwide character-encoding standard. Unicode is supported by all 32-bit versions
of Microsoft Windows and by 32-bit OLE technology.


ช่วยได้มากเลย - -" ยอมครับยอม
พอดีคุณให้ตัวเลขมา แล้วบอกเป็น unicode
205F D289

ก็เลยถึงบางอ้อ คำตอบก็คือ ฟังก์ชันนี้จะแปลงเป็น unicode แบบ UTF-16

ทำความรู้จักกับ utf-16 ก่อน
อย่างที่รู้กัน unicode จะแทน อักขระทุกตัวในโลก(ตั้งใจไว้อย่างนั้นนะ) ดัวยรหัส
1 รหัส ต่อ 1 อักขระ
โดยแบ่งออกเป็น 17 planes แต่ละ plane จะมีขนาด 2^16=65,536
plane 0 (รหัส 0000-FFFF) มีชื่อว่า Basic Multilingual Plane (BMP)
การเข้ารหัสแบบ utf-16 แบบคร่าวๆ ก็คือ
ถ้าเป็นอักขระใน plane 0 ก็ใช้ 2 ไบต์ แทนค่าไปเลยตรงๆ ตามรหัส
เช่นอักขระ รหัส 2E6F (อยู่ใน plane 0) เมื่อเข้ารหัส ก็ได้ 2E6F
สำหรับอักขระนอกเหนือจากนี้ ใช้ 4 ไบต์
(วิธีการ ไม่ขอเอ่ยถึง ก็บอกแบบคร่าวๆ ไง 555)

มาดูปัญหาข้อแรกของคุณ
ผลที่ได้คือ
มันได้เป็น ฑiจค แบบ unicode (8byte) แทน - -*


คำตอบก็อยู่ที่ คำจำกัดความของ vbUnicode ที่ผมยกมา
สังเกตคำว่า default code page
วินโดว์ภาษาไทย ใช้ code page 874
วินโดว์ภาษาจีน ใช้ code page 950 (โดยการดัดแปลง จาก Big5)
ข้อมูลเพิ่มเติมอีกก็คือ ภาษาไทยใช้ 1 ไบต์ ต่อ 1 อักขระ ส่วนจีนใช้ 2 ไบต์ ต่อ 1 อักขระ
ทีนี้ วินโดว์ ก็มีกระบวนการภายใน ทีแปลงจาก code page ต่างๆ เป็น unicode
ภาษาไทยเรา ได้รหัส unicode อยู่ในช่วง 0E00 - 0E7F
ภาษาจีนเอง ก็ได้รหัสหมวด CJK (Chinese, Japanese, and Korean) ซึ่งมีหลายช่วง แต่ก็ไม่เกิน FFFF
เมื่อเข้ารหัสแบบ utf-16 ก็เลยได้ 2 ไบต์ ต่อ 1 อักขระ เหมือนกันทั้งสองภาษา
ทีนี้ จาก ข้อมูลที่มี คือ B1 69 A8 A4
วินโดว์มันก็นึกว่าเป็นภาษาไทย 4 อักขระ (ผมคิดว่าคุณคงใข้วินโดว์ไทย) มันก็เลยแปลงออกมาได้ 8 ไบต์

ต่ออีกปัญหา
(จะใช่ปัญหาหรือเปล่าไม่ทราบ อ่านเล่นๆ ละกัน)
บางคนอาจยังสงสัยว่า
จาก B1 69 A8 A4 เป็น 205F D289 ได้อย่างไร
เลขชุดแรก ก็คือ รหัส ตาม code page ของวินโดว์ อีกชุด ก็ unicode
เขามีรหัสตายตัว ฟังก์ชัน ก็เลยทำงานง่ายๆ คือเทียบค่าในตารางของแต่ละชุดนั่นเอง
ถ้าไปดูในตาราง ก็จะได้คำตอบว่า
code page 950 ---> unicode
0xB169 ---> 0x5F35
0xA8A4 ---> 0x89D2
(ผมไปดูในตาราง มันได้ 0x5F35 ในที่นี้ได้ 5F20 ได้อย่างไรไม่ทราบได้นะครับ
ตรวจสอบไม่ได้อ่ะ อ่านภาษาจีนไม่ออก ไม่รู้ใครผิดเหมือนกัน)
ส่วนที่เห็นเลขสับกัน ก็เป็นเรื่องของ bye ordering (คนที่เขียนบอทเป็น ก็คงเข้าใจเรื่องนี้ละ ไม่อธิบายนะครับ)

ปัญหาการแสดงผลของ notepad
อาจจะตอบได้ง่ายๆว่า โปรแกรมมันโง่ครับ (หรือของผมโง่เองก็ไม่ทราบได้ เพราะผมไม่ได้ลงฟอนท์ไว้)
ผมเลยไม่แน่ใจตรงจุดนี้ว่า notepad มันโอเค กับ unicode หรือเปล่า
แต่ผมว่ามันคงโอเค เพราะมันเซฟเป็น unicode ได้
ใครอยากลอง ก็เอาข้อมูลนี้ไป ใช้ hexeditor นะ แล้วเซฟเป็น .txt แล้วเปิดด้วย nodepad ดู
FFFE 205F D289 010E

ถ้าโอเค ก็จะได้ อักขระจีน 2 ตัว และตามด้วย ก ไก่
ถ้าเปิดโดยบราวเซอร์ เลือก utf-16

Byte Order Mark (BOM)
ถ้าจะไม่กล่าวถึงเรื่องนี้ ก็อาจจะไม่สมบูรณ์
จากข้อมูลที่ผมยกมา อาจมีคนสงสัยว่า FFFE มันคืออะไร
มันมีไว้เพื่อแก้ปัญหาเรื่อง byte ordering นั่นแหละครับ
มันช่วยให้ โปรแกรมที่อ่านไฟล์ รู้วิธีว่า ควรอ่านอย่างไร

จากตัวเลข 0x1234 0xABCD ถ้าคุณใช้ hex editor เปิดดู แล้วเจอ
34 12 CD AB นั่นก็แสดงว่าเป็น Little Endian
12 34 AB CD นั่นก็แสดงว่าเป็น ฺBig Endian

FFFE ก็เป็นการบอกว่า ข้อมูลที่ตามมาเข้ารหัสแบบ utf-16 และเป็น Little Endian นะ
FEFF ก็เป็นการบอกว่า ข้อมูลที่ตามมาเข้ารหัสแบบ utf-16 และเป็น Big Endian นะ


พูดมาซะยืดดดดดยาว
ทางออกสำหรับเรื่องนี้หล่ะ คืออะไร

จากข้อมูลที่ให้มา คุณสามารถ เขียนฟังก์ชันเข้ารหัส utf-16 ได้เอง
โดยดูว่า ตอนนี้ต้นฉบับเป็นภาษาอะไร เพื่อเลือก code page ได้ตรงกัน
จากนั้นก็แปลงไปเป็น unicode โดยเทียบค่ากัน
ตารางเทียบค่าดูได้จากที่นี่
http://www.unicode.o...NDOWS/CP874.TXT
http://www.unicode.o...NDOWS/CP950.TXT
อย่าลืมใส่ BOM หล่ะ

หรืออีกแบบ ใช้ฟังก์ชันเดิม แต่เปลี่ยน code page ให้ตรงกับภาษา เพื่อให้ฟังก์ชันทำงานได้ถูกต้อง

ส่วนการแสดงผลก็อยู่ที่โปรแกรมเองหละครับ ว่าสนับสนุน unicode ดีแค่ไหน

#3 X CroSs

X CroSs

    Truebot Co-Developer

  • Root Administrator
  • 102427 โพสต์
  • Gender:Male

โพสต์เมื่อ 28 April 2007 - 08:34:43 AM

โอ้ว ขอบคุณมาก ๆ ครับ เรื่อง FFFE เป็น header ของ utf-16 .txt นี่พอรู้อ่ะครับ

ปัญหาคือผมขี้เกียจเขียน function แบบนั่ง map ตัวอักษรทีละตัว อ้างอิงจาก unicode.org นี่อ่ะจิ กว่าจะเสร็จ ลมใส่พอดี
พอดีไป search เจอ api นึง ชื่อ MultiByteToWideChar แล้วน่าใช้ดี แต่ยังหาตัวอย่างเนียนๆมะได้ซักที กับอีกอันชื่อ MultiByteToUnicode น่าจะใช้ไม่ต่างกันมาก

http://www.cyberacti...eTutorialVb.htm ข้อมูล unicode ที่น่าสนใจ

ปล.เพิ่งปิ๊ง idea ใหม่ ผมน่าจะโหลด cp950.txt , cp874.txt จาก unicode.org มาทำ map table มันซะเลยเนอะ อุอุ

ts.gif

manutd18wm.png


#4 supersim

supersim

    จอมยุทธใหม่

  • Members
  • 2 โพสต์

โพสต์เมื่อ 28 April 2007 - 01:35:06 PM

ไร้วาจาจะกล่าว

ไม่เคยรู้เรื่อง Unicode อ่านแล้ว ก็พอๆ จะงืมงัมๆ บ้าง

ขอขอบคุณด้วยคนครับ _/|\_








0 สมาชิกกำลังอ่านกระทู้นี้

0 สมาชิก, 0 ผู้เยี่ยมชม, 0 ผู้ใช้งานที่ซ่อนตัว