ทำไม 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 เบอร์แล้วพบว่าทุกฉบับถูกคิดเป็นสองข้อความ ไม่ใช่เรื่องที่แก้ทีหลังได้