ภาษาไทยเป็นเครื่องหมายคำถาม: ? และ � หมายถึงอะไร

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

รองรับข้อความและไฟล์เหล่านี้:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

เช่น ไฟล์ส่งออกจาก Excel ข้อมูลสำรองฐานข้อมูล คำบรรยาย หรือโค้ดเว็บไซต์

แก้ไข

  1. ลากไฟล์มาวางหรือวางข้อความ
  2. แก้ให้อัตโนมัติ
  3. คัดลอกหรือดาวน์โหลด
หรือลากไฟล์มาวางที่นี่
  • ไม่ต้องอัปโหลด ไฟล์ถูกแก้ในเบราว์เซอร์ของคุณและไม่ออกจากอุปกรณ์

  • เซิร์ฟเวอร์ในสหภาพยุโรป Mojibuster ทำงานบนเซิร์ฟเวอร์ที่ ฟินแลนด์ (สหภาพยุโรป) จึงอยู่ภายใต้กฎหมายคุ้มครองข้อมูลทั่วไป (GDPR) อ่าน GDPR (EUR-Lex ภาษาอังกฤษ)

แบบที่ 1: ไฟล์ยังดีอยู่ แต่แสดงเป็น �

ถ้าโปรแกรมแก้ไขข้อความ โปรแกรมดูหนัง หรือเบราว์เซอร์แสดงภาษาไทยทั้งหมดเป็น � ส่วนใหญ่ไฟล์ถูกบันทึกเป็น TIS-620 หรือ Windows-874 แต่โปรแกรมอ่านเป็น UTF-8 ไบต์ของตัวอักษรไทยใน TIS-620 ใช้ไม่ได้ใน UTF-8 โปรแกรมจึงใส่ � เฉพาะตอนแสดงผล ในไฟล์ยังมีไบต์ที่ถูกต้องครบ

วิธีแก้: ลากไฟล์ต้นฉบับมาวางในกรอบด้านบน Mojibuster ตรวจการเข้ารหัสตอนอ่านไฟล์และบันทึกใหม่เป็น UTF-8 สำคัญ: ใช้ตัวไฟล์ อย่าคัดลอกข้อความจากโปรแกรม เพราะการคัดลอกจะทำให้ � ติดอยู่ถาวร ดูรายละเอียดที่ แปลง TIS-620 เป็น UTF-8

แบบที่ 2: ? หรือ � ถูกบันทึกลงในข้อความแล้ว

ถ้าโปรแกรมบันทึกหรือส่งต่อข้อความที่มี � ไปแล้ว ตัวอักษรเดิมก็หายไป ? ก็เช่นกัน โปรแกรมจะใส่ ? เมื่อการเข้ารหัสปลายทางไม่มีตัวอักษรนั้น เช่น บันทึกเป็น ASCII หรือเขียนลงคอลัมน์ฐานข้อมูลที่ไม่รองรับภาษาไทย แล้วได้ ???? แทนชื่อลูกค้า

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

เครื่องหมายคำถามมาจากไหน

  • ฐานข้อมูล: คอลัมน์หรือการเชื่อมต่อใช้ latin1 หรือ ascii แต่ข้อมูลเข้ามาเป็น UTF-8 MySQL จึงแทนภาษาไทยด้วย ? ดู MySQL และ phpMyAdmin
  • เว็บไซต์ PHP รุ่นเก่า: หน้าเว็บเป็น TIS-620 แต่ไม่ได้ระบุการเข้ารหัสใน header หรือ <meta charset> เบราว์เซอร์อ่านเป็น UTF-8 และแสดง � ถ้าเชื่อมต่อฐานข้อมูลโดยไม่กำหนดการเข้ารหัส ภาษาไทยจะถูกเก็บเป็น ?
  • Notepad บันทึกเป็น "ANSI": บน Windows ภาษาอังกฤษ ANSI คือการเข้ารหัสแบบตะวันตก ภาษาไทยจึงถูกบันทึกเป็น ? บน Windows ภาษาไทย ANSI คือ Windows-874 ภาษาไทยยังอยู่ แต่อีโมจิและอักขระอื่นจะกลายเป็น ?
  • PowerShell 5.1: Export-Csv บันทึกเป็น ASCII โดยค่าเริ่มต้น และแทนภาษาไทยด้วย ? ดู PowerShell
  • Python: encode('ascii', errors='replace') แทนตัวอักษรด้วย ? โดยไม่แจ้งเตือน ดู Python และ pandas
  • หน้าต่าง Command Prompt: ถ้า code page ของคอนโซลไม่มีภาษาไทย จะแสดงเป็น ? ส่วนใหญ่ผิดแค่การแสดงผล ไฟล์ยังถูกต้อง
  • อีเมลเก่าและโปรแกรมบัญชีเก่า: ข้อความที่ส่งออกเป็น TIS-620 เมื่อเปิดในโปรแกรมที่คาดว่าเป็น UTF-8 จะเห็นเป็น �

รู้ได้อย่างไรว่าเป็นแบบไหน

  1. เปิดไฟล์ในโปรแกรมที่แสดงการเข้ารหัส เช่น Notepad++ ถ้าแถบสถานะเขียนว่า "ANSI" หรือ "TIS-620" แสดงว่าเป็นแบบที่ 1
  2. ลากไฟล์มาวางใน Mojibuster ถ้าอ่านเป็น Windows-874 แล้วภาษาไทยกลับมา แสดงว่าเป็นแบบที่ 1
  3. ถ้า Mojibuster แจ้งว่ามีตัวอักษรที่หายไป แสดงว่าเป็นแบบที่ 2 ต้องส่งออกข้อมูลใหม่เท่านั้น

ถ้าเห็นตัวอักษรแปลก ๆ อย่าง ä·Â แทนเครื่องหมายคำถาม นั่นเป็นปัญหาอีกแบบ และเกือบทุกครั้งแก้ได้: ภาษาต่างดาวคืออะไร

คำถามที่พบบ่อย

Mojibuster เปลี่ยน ? กลับเป็นภาษาไทยได้ไหม

ไม่ได้ ? อาจเป็นตัวอักษรตัวไหนก็ได้ ข้อมูลหายไปแล้ว Mojibuster จะไม่แตะตำแหน่งเหล่านั้น แต่แจ้งว่ามีกี่ตำแหน่ง

ทำไมโปรแกรมหนึ่งแสดง � แต่อีกโปรแกรมแสดงปกติ

แปลว่าไฟล์ยังดีอยู่ มีแค่โปรแกรมเดียวที่อ่านด้วยการเข้ารหัสผิด แปลงไฟล์เป็น UTF-8 ด้วย Mojibuster แล้วทั้งสองโปรแกรมจะแสดงถูกต้อง

สัญลักษณ์ � คืออะไร

คืออักขระแทนที่ U+FFFD โปรแกรมใส่ไว้เมื่ออ่านไบต์เป็นตัวอักษรไม่ได้ เป็นสัญญาณของปัญหาการเข้ารหัส ไม่ใช่ส่วนหนึ่งของข้อความจริง

คู่มืออื่น ๆ