Toolora

ทำไม SMS ภาษาไทยส่งได้แค่ 70 ตัวอักษร

กลไกเบื้องหลังตัวเลข 160 กับ 70 และเหตุผลที่ข้อความซึ่งดูแค่ 52 ตัวอักษรกลับถูกคิดเป็นสองข้อความ

คุณพิมพ์ข้อความสั้น ๆ ส่งออกไปหนึ่งครั้ง แล้วพบว่าถูกหักเครดิตสองข้อความ หรือกำลังเขียนข้อความแจ้งเตือนลูกค้าแล้วหาไม่เจอว่าตกลงพิมพ์ได้กี่ตัวอักษรกันแน่

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

หนึ่งข้อความคือ 140 ไบต์

มาตรฐาน SMS ถูกออกแบบไว้ตั้งแต่ยุคที่ช่องสัญญาณมีราคาแพงมาก ผู้ออกแบบจึงกันพื้นที่ให้ข้อความหนึ่งก้อนไว้เพียง 140 ไบต์ หรือ 1,120 บิต แล้วไม่เคยขยายอีกเลย

ทีนี้อยู่ที่ว่าตัวอักษรหนึ่งตัวใช้กี่บิต

  • GSM-7 — ตารางอักขระดั้งเดิมของ SMS บรรจุตัวอักษรละติน ตัวเลข และสัญลักษณ์พื้นฐาน ใช้เพียง 7 บิตต่อตัวอักษร นำ 1,120 หารด้วย 7 ได้ 160 ตัวอักษร
  • UCS-2 — การเข้ารหัสสำรองสำหรับตัวอักษรที่ไม่มีในตาราง GSM-7 ใช้ 16 บิตต่อตัวอักษร นำ 1,120 หารด้วย 16 ได้ 70 ตัวอักษร

ตารางอักขระ GSM-7 ไม่มีอักษรไทยแม้แต่ตัวเดียว ข้อความภาษาไทยจึงต้องใช้ UCS-2 เสมอ

เรื่องนี้ไม่ใช่การกีดกันภาษาไทยโดยเฉพาะ ภาษาจีน ญี่ปุ่น เกาหลี อาหรับ หรือแม้แต่ภาษายุโรปที่มีอักษรพิเศษบางตัว ก็เจอเงื่อนไขเดียวกันทั้งหมด ตารางเดิมถูกออกแบบมาเพื่อภาษาอังกฤษ และภาษาอื่นได้พื้นที่ที่เหลือ

อักษรไทยตัวเดียวก็เปลี่ยนทั้งข้อความ

จุดที่ทำให้คนเสียเงินโดยไม่รู้ตัวคือ การเข้ารหัสถูกเลือกทีละข้อความ ไม่ใช่ทีละตัวอักษร ถ้ามีอักษรที่อยู่นอกตาราง GSM-7 แม้แต่ตัวเดียว ทั้งข้อความจะเปลี่ยนไปใช้ UCS-2 ทันที

ข้อความ การเข้ารหัส พื้นที่ทั้งหมด
Your OTP is 482913 GSM-7 160 ตัวอักษร
Your OTP is 482913 ครับ UCS-2 70 ตัวอักษร

คำว่า “ครับ” ที่ตาเห็นเพียงสามตัวอักษร ทำให้พื้นที่ของข้อความหายไป 90 ตัวอักษร นี่คือเหตุผลที่ข้อความ OTP หรือข้อความระบบจำนวนมากเลือกใช้ภาษาอังกฤษล้วน ไม่ใช่เพราะขี้เกียจแปล แต่เพราะการเติมคำสุภาพภาษาไทยเข้าไปคำเดียวมีต้นทุนจริง

เกิน 70 แล้วไม่ได้ส่งไม่ออก แต่ถูกหั่น

ถ้าข้อความยาวเกินขีดจำกัด ระบบจะไม่ปฏิเสธ แต่จะหั่นเป็นหลายท่อนแล้วประกอบกลับที่ปลายทาง ผู้รับเห็นเป็นข้อความเดียว ส่วนคุณจ่ายตามจำนวนท่อน

และแต่ละท่อนได้พื้นที่น้อยลงกว่าเดิม เพราะต้องเสียส่วนหนึ่งไปกับข้อมูลกำกับว่าท่อนนี้เป็นท่อนที่เท่าไรจากทั้งหมดกี่ท่อน ข้อมูลส่วนนี้กิน 6 ไบต์ เหลือพื้นที่จริง 1,072 บิต

การเข้ารหัส ข้อความเดียว เมื่อถูกหั่นเป็นท่อน
GSM-7 160 153 ต่อท่อน
UCS-2 70 67 ต่อท่อน

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

สระและวรรณยุกต์นับแยก

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

UCS-2 นับตามจุดรหัส Unicode ไม่ได้นับตามรูปที่ตาเห็น สระและวรรณยุกต์ของไทยเป็นจุดรหัสแยกที่ไปเกาะอยู่บนพยัญชนะ คำว่า ที่ ที่ตาเห็นเป็นหนึ่งตัวอักษร เครือข่ายนับเป็นสาม คือ ท + สระอี + ไม้เอก

ลองดูข้อความโปรโมชันจริง:

รับส่วนลด 20% เมื่อสั่งซื้อวันนี้ กดลิงก์เพื่อดูรายละเอียดเพิ่มเติมได้เลย

ตาเห็น 52 ตัวอักษร ดูแล้วยังห่างจาก 70 อยู่มาก แต่เครือข่ายนับได้ 73 จึงถูกหั่นเป็นสองท่อน คุณจ่ายสองข้อความสำหรับสิ่งที่นับด้วยตาแล้วไม่ถึงสามในสี่ของโควตา

ยิ่งข้อความมีสระบนสระล่างและวรรณยุกต์หนาแน่นเท่าไหร่ ช่องว่างระหว่างสิ่งที่ตาเห็นกับสิ่งที่เครือข่ายนับก็ยิ่งกว้างขึ้นเท่านั้น คำที่มีสระซ้อนอย่าง เพื่อน ตาเห็นสี่ตัวอักษร นับได้หก

เขียนให้พอดีกับ 70 ตัว

เมื่อรู้กลไกแล้ว การลดจำนวนลงมีทางเลือกไม่กี่ทาง และแต่ละทางมีต้นทุนของมันเอง

  • ตัดคำสุภาพในข้อความระบบ — “ครับ” “ค่ะ” “ขอบพระคุณ” กินพื้นที่จริง ข้อความแจ้ง OTP หรือแจ้งสถานะพัสดุมักไม่จำเป็นต้องมี แต่ข้อความหาลูกค้าอาจจำเป็น ต้องชั่งน้ำหนักเอง
  • ย่อลิงก์ — URL เป็นอักษรละตินก็จริง แต่เมื่ออยู่ในข้อความไทย มันถูกนับด้วย UCS-2 เหมือนกันหมด ลิงก์ยาว 40 ตัวอักษรกินโควตาไปกว่าครึ่ง
  • ตัดหัวจดหมาย — “เรียนคุณลูกค้าที่เคารพ” ตาเห็น 16 ตัวอักษร แต่เครือข่ายนับ 22 คิดเป็นเกือบหนึ่งในสามของโควตาทั้งข้อความ โดยแทบไม่เพิ่มข้อมูลให้ผู้รับ
  • พิจารณาว่าต้องเป็นภาษาไทยไหม — ข้อความ OTP ที่มีแต่ตัวเลขและอังกฤษได้พื้นที่ 160 ตัวอักษร มากกว่าสองเท่า

ทางที่ไม่ควรทำคือการถอดเป็นคำอ่านภาษาอังกฤษเพื่อประหยัดพื้นที่ มันได้ 160 ตัวอักษรกลับมาจริง แต่อ่านยากจนผู้รับอาจเข้าใจผิดหรือคิดว่าเป็นข้อความหลอกลวง

นับก่อนส่ง

เครื่องมือนับคำและตัวอักษร แสดงทั้งจำนวนตัวอักษรที่ตาเห็นและจำนวนจุดรหัสแยกกัน ตัวเลขที่ต้องใช้เทียบกับขีดจำกัด SMS คือจำนวนจุดรหัส ไม่ใช่ตัวอักษรที่ตาเห็น

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

ทุกอย่างทำงานในเบราว์เซอร์ของคุณ ข้อความที่วางลงไปไม่ถูกส่งออกไปที่ใด ซึ่งสำคัญเมื่อสิ่งที่คุณกำลังนับคือข้อความที่มีชื่อลูกค้าหรือเลขคำสั่งซื้ออยู่ข้างใน

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

การนับก่อนกดส่งใช้เวลาไม่ถึงนาที การส่งข้อความ 5,000 เบอร์แล้วพบว่าทุกฉบับถูกคิดเป็นสองข้อความ ไม่ใช่เรื่องที่แก้ทีหลังได้