19 มิถุนายน 2562

อักษรไทยเป็นสี่เหลี่ยม สัญลักษณ์แปลก ๆ | สาเหตุและวิธีแก้ปัญหา

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


วิธีที่ 1 ตั้งภูมิภาคเป็นไทย

แต่ละประเทศใช้รูปแบบบางอย่างไม่เหมือนกัน เช่น การเขียนวันที่ (วัน/เดือน/ปี, เดือน/วัน/ปี ฯลฯ) การเขียนเวลา (แบบ 12 ชั่วโมง, แบบ 24 ชั่วโมง) ภูมิภาคที่ตั้งไว้จะถูกใช้เป็นค่าเริ่มต้นสำหรับโปรแกรมต่าง ๆ ถ้าโปรแกรมแสดงผลภาษาไทยและใช้ค่าเริ่มต้น แต่เราไม่ได้ตั้งภูมิภาคไว้เป็นไทยไว้ โปรแกรมจะใช้รูปแบบตามที่ตั้งไว้มาแสดงผลภาษาไทย ทำให้ตัวอักษรไทยอาจผิดเพี้ยนไปจากปกติได้ ปัญหานี้พบเจอบ่อยในโปรแกรมเก่าบางโปรแกรม ส่วนโปรแกรมใหม่ไม่ค่อยเจอปัญหานี้แล้ว ถึงอย่างนั้นวิธีนี้เป็นวิธีที่อยากให้เริ่มต้นลองก่อนวิธีอื่น ถ้าวิธีนี้แก้ปัญหาไม่ได้อย่างน้อยก็ได้ตั้งค่ารูปแบบให้เป็นแบบที่คนไทยคุ้นเคย

รูปประกอบข้างล่างเป็นรูปจาก Windows 10 สำหรับ Windows อื่นอาจแตกต่างไปเล็กน้อย

1. เข้า Control Panel จากนั้นคลิกดังนี้
  • สำหรับ Windows 8, 8.1, 10 คลิก Region
  • สำหรับ Windows 7 คลิก Region and Language
  • สำหรับ Windows XP คลิก Regional and Language Options


2. คลิกแท็บ Formats เลือก Thai (Thailand) ในตัวเลือก Format: ขั้นตอนนี้คือการเลือกรูปแบบการแสดง

3. คลิกแท็บ Adminstrative (สำหรับ Windows XP คือแท็บ Advanced) คลิกปุ่ม Change system locale... ที่อยู่ในกลุ่ม Language for non-Unicode programs

4. เลือก Thai (Thailand) ในตัวเลือก Current system locale: ขั้นตอนนี้คือการเลือกภาษาสำหรับข้อมูลที่ไม่ได้เข้ารหัสแบบ Unicode (จะอธิบายเรื่องนี้ในวิธีที่ 3)

5. คลิกปุ่ม OK ทั้งหน้าต่าง Region Setting และหน้าต่าง Region


วิธีที่ 2 เปลี่ยนฟอนต์

ฟอนต์บางฟอนต์ไม่มีตัวอักษรภาษาไทย จึงไม่สามารถแสดงตัวอักษรภาษาไทยได้  ผู้พัฒนาโปรแกรมบางโปรแกรมไม่อยากให้เกิดปัญหานี้ ผู้พัฒนาจึงกำหนดฟอนต์สำรองไว้ในกรณีที่ฟอนต์หลักไม่มีตัวอักษรภาษานั้น ส่วนโปรแกรมที่ไม่มีฟอนต์สำรองอาจแสดงเป็นสี่เหลี่ยม สัญลักษณ์แปลก ๆ หรือตัวอักษรภาษาอื่นแทน วิธีแก้ปัญหาก็เพียงแค่เปลี่ยนเป็นฟอนต์ที่มีตัวอักษรภาษาไทย


วิธีที่ 3 ใช้ Unicode แทน ASCII/ANSI

ไม่ว่าคอมพิวเตอร์ของท่านจะมีปัญหาการแสดงภาษาไทยหรือไม่ก็ตาม ผู้เขียนแนะนำให้ใช้ Unicode ในการเข้ารหัสตัวอักษรทุกครั้ง ถ้าตั้งเป็น ASCII หรือ ANSI อาจไม่มีปัญหาในคอมพิวเตอร์ของท่าน แต่อาจมีปัญหาเมื่อเปิดข้อมูลนั้นในคอมพิวเตอร์เครื่องอื่น เรื่องนี้ค่อนข้างเป็นเชิงทฤษฎีหน่อย ค่อย ๆ ทำความเข้าใจ

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

ปัญหาของเราอยู่ที่ตรงนี้ จำนวนเลขฐานสองในแต่ละชุดมีกี่ตัว? เมื่อเรียงกันแล้วแต่ละค่าแปลเป็นตัวอักษรอะไรบ้าง? ตรงนี้ขึ้นอยู่กับผู้คิดค้นเลยว่าจะตั้งเท่าไรหรือตั้งแบบไหน มีหลายมาตรฐานหลายวิธีในเรื่องนี้ การแปลข้อมูลเป็นตัวอักษรจึงทำได้หลายวิธี แต่วิธีที่ถูกต้องมีเพียงวิธีเดียวคือวิธีเดียวกับตอนที่บันทึกข้อมูล ถ้าแปลผิดวิธีก็ได้ตัวอักษรที่ผิดไปจากเดิม (แสดงเป็นสี่เหลี่ยมหรือสัญลักษณ์แปลก ๆ นั่นเอง) รูปแบบที่นิยมคือ ASCII, ANSI และ Unicode

ASCII

ASCII เป็นรูปแบบเก่าที่สุดเมื่อเทียบกับ ANSI และ Unicode รูปแบบนี้มีขนาด 7 bit สามารถเก็บตัวอักษรได้ 2 ^ 7 = 128 ตัว รูปแบบนี้ออกแบบมาสำหรับใช้งานภาษาอังกฤษเท่านั้น ตัวอักษรไม่เพียงพอสำหรับใส่ตัวอักษรภาษาอื่น ASCII 7 bit จึงไม่สามารถใช้งานภาษาอื่นได้ รวมทั้งภาษาหลายภาษาที่ใช้ตัวอักษรละติน เพราะไม่มีตัวอักษรละตินที่มีเครื่องหมายกำกับ เช่น ç, é, ü

Extended ASCII และ ANSI

เนื่องจาก ASCII แบบเดิมที่มี 7 bit ไม่รองรับภาษาอื่นนอกจากภาษาอังกฤษ จึงมีการนำ ASCII แบบเดิมมาเพิ่มจำนวนเลขฐานสองเป็น 8 bit ทำให้สามารถเก็บตัวอักษรได้ 2 ^ 8 = 256 ตัว ส่วนที่เพิ่มมาจากเดิมคือส่วนที่ใส่ตัวอักษรของภาษาอื่น เช่น ตัวอักษรละตินที่มีเครื่องหมาย และภาษาไทย รูปแบบใหม่นี้เรียกว่า Extended ASCII หรือ ASCII 8 bit ส่วนรูปแบบ ANSI คืออีกรูปแบบที่คล้ายกับ Extended ASCII มีจำนวน 8 bit เหมือนกัน ต่างกันตรงตัวอักษรที่เพิ่มขึ้นมา

Extended ASCII และ ANSI รองรับภาษาอื่นได้ก็จริง แต่เนื่องจากมีพื้นที่เหลือเพียง 128 ตัวอักษร จึงทำให้รองรับภาษาได้อีกเพียงหนึ่งภาษาเท่านั้น และภาษานั้นต้องมีตัวอักษรไม่เกิน 128 ตัว การอ่านข้อมูลที่เป็น Exteneded ASCII หรือ ANSI ต้องระบุด้วยว่าภาษาที่เพิ่มมานั้นเป็นภาษาอะไร เพราะข้อมูลรหัสเดียวกันสามารถแปลเป็นตัวอักษรได้หลายตัวขึ้นอยู่กับภาษา เช่น รหัส 11011101 ในภาษาไทยก็เป็นตัวอักษรหนึ่ง ในภาษากรีกก็เป็นตัวอักษรอีกตัวหนึ่ง ถ้าระบุไม่ตรงกับตอนบันทึกข้อมูลก็จะทำให้แสดงเป็นภาษาอื่นแทน (หรืออาจเป็นสี่เหลี่ยมที่หลายคนเจอกัน)

นอกจากนี้ยังมี Wide ASCII ซึ่งมีขนาดใหญ่กว่า 8 bit และรองรับภาษาที่มีตัวอักษรเกิน 128 ตัว แต่เนื่องจากไม่จำเป็นสำหรับภาษาไทย ดังนั้นจึงไม่อธิบาย Wide ASCII ในบทความนี้

Unicode

Unicode คือทางเลือกที่ดีกว่าสำหรับการใช้งานภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ จุดเด่นของ Unicode คือการรวมตัวอักษรทุกภาษาเข้าไว้ด้วยกัน แต่ละตัวอักษรมีรหัสที่ไม่ซ้ำกับตัวอักษรในภาษาอื่น ทำให้หมดปัญหาเรื่องแปลตัวอักษรออกมาผิดภาษา (รวมทั้งขึ้นเป็นสี่เหลี่ยม) และสามารถแสดงหลายภาษาพร้อมกันได้ จุดเด่นอีกข้อคือรองรับภาษาที่มีตัวอักษรเกิน 128 ตัวได้ เช่น ภาษาจีน ภาษาญี่ปุ่น Unicode มีหลายขนาด เช่น 16 bit (เก็บได้ 65,536 ตัวอักษร), 32 bit (เก็บได้ 4,294,967,296 ตัวอักษร)

Unicode เป็นการแก้ปัญหาภาษาที่ดีและเป็นที่นิยมมาก ข้อเสียที่ต้องแลกมาคือจำนวน bit ที่มากขึ้น ทำให้ไฟล์ข้อมูลมีขนาดใหญ่ แต่เรื่องนี้ไม่ใช่ปัญหาใหญ่สำหรับคอมพิวเตอร์ในปัจจุบัน เพราะคอมพิวเตอร์ในปัจจุบันมีหน่วยความจำถาวรที่มีขนาดข้อมูลมาก และอินเทอร์เน็ตก็รวดเร็วพอที่จะส่งข้อมูลขนาดใหญ่ในเวลาอันสั้น
รูปข้างบนนี้แสดงส่วนหนึ่งของตัวอักษรใน Unicode ตั้งแต่ตัวอักษรรหัสที่ 0 ถึงรหัสที่ 16,383 (ฐานสิบ) ผู้อ่านสามารถดูแผนที่ตัวอักษร Unicode ฉบับเต็มได้ที่ https://github.com/hakatashi/unicode-map


ผู้เขียนแนะนำให้บันทึกข้อมูลด้วยรูปแบบ Unicode เสมอ เช่น เมื่อบันทึกไฟล์ใน Notepad ตั้งเป็น Unicode แทนค่าเริ่มต้นที่เป็น ANSI เมื่อสร้างเว็บไซต์ตั้งเป็น Unicode เมื่อสร้างเกมตั้งเป็น Unicode การตั้งค่าเหล่านี้ให้ตั้งที่ตัวโปรแกรมที่ใช้งานนั้น ส่วนการอ่านข้อมูลให้ลองอ่านแบบ Unicode ก่อน ถ้าแสดงผลไม่ถูกต้องจึงเปลี่ยนเป็นแบบ Extended ASCII หรือ ANSI ในส่วนตัวอักษรให้เลือก TIS-620 (ภาษาไทย) หรือ ISO-8859-11 (ภาษาไทย)


วิธีที่ 4 เปลี่ยนโปรแกรมที่ใช้

ถ้าโปรแกรมที่ใช้ไม่รองรับ Unicode และการตั้งค่า Extended ASCII หรือ ANSI ในโปรแกรมไม่รองรับภาษาไทย โปรแกรมนั้นก็ไม่สามารถใช้ภาษาไทยได้อย่างสมบูรณ์ ปัญหานี้เกิดในขั้นตอนการพัฒนาโปรแกรมนั้น ผู้พัฒนาโปรแกรมอาจไม่ได้ให้ความสำคัญกับการใช้ภาษาอื่น ทางเลือกมีเพียงแค่ทนใช้โปรแกรมนั้นต่อไป แต่แสดงผลภาษาไทยไม่ปกติ หรือเปลี่ยนไปใช้โปรแกรมอื่นแทน ส่วนข้อมูลบางอย่างที่ไม่สามารถใช้โปรแกรมอื่นแทนได้ เช่น ปัญหาภาษาไทยในเกมที่ไม่ใช่เกมของเรา ก็ต้องทำใจเรื่องปัญหาการแสดงตัวอักษรภาษาไทย

ถ้าท่านสร้างเกมหรือโปรแกรมเอง และแบ่งปันเกมหรือโปรแกรมนั้นให้คนอื่น ผู้เขียนแนะนำว่าให้ใช้ข้อมูลแบบ Unicode ตั้งแต่แรก ผู้ใช้โปรแกรมจะได้ไม่หงุดหงิดกับปัญหาตัวอักษรภาษาไทยจนเปลี่ยนโปรแกรมไปก่อน


วิธีข้างต้นทั้งหมดเป็นวิธีแก้ปัญหาการแสดงตัวอักษรภาษาไทยจากสาเหตุที่พบบ่อย เน้นว่าปัญหาการแสดงภาษาไทยในบทความนี้หมายถึงพวกเป็นสี่เหลี่ยม สัญลักษณ์แปลก ๆ หรือตัวอักษรภาษาอื่น ถ้าท่านพบปัญหาภาษาไทยแบบอื่น เช่น สระลอย วรรณยุกต์ลอย วรรณยุกต์ทับกับสระ ให้ท่านอ่านบทความอื่นแทน เพราะปัญหาเหล่านั้นไม่ได้เกิดจากการแสดงผลที่อธิบายในบทความนี้

ถ้าท่านลองทำทุกวิธีในบทความนี้แล้วยังแก้ปัญหาการแสดงตัวอักษรภาษาไทยไม่ได้ ท่านสามารถขอความช่วยเหลือได้ที่ความคิดเห็นข้างล่างนี้ได้เลย หรืออีกหนึ่งช่องทางคือพูดคุยกับเราทางเพจ Facebook ชื่อเพจว่า Planila Game Developer

ไม่มีความคิดเห็น:

แสดงความคิดเห็น