Đếm ký tự, số tin SMS API

Đếm số tin SMS (GSM-7 160/153 hoặc UCS-2 70/67), chỉ ra ký tự làm tin chuyển sang Unicode, tạo bản không dấu an toàn GSM và kiểm tra brandname.

GETPOSThttps://apibox.io.vn/v1/sms-count

Một tin SMS chứa 160 ký tự thuộc bảng chữ GSM 7-bit, nhưng chỉ còn 70 ký tự khi có một ký tự ngoài bảng (UCS-2), và tin dài được chia thành các phần 153 hoặc 67 ký tự. Vì vậy mỗi chữ có dấu tiếng Việt, dấu nháy cong hay emoji có thể làm chi phí tăng gấp đôi, gấp ba. API cho biết kiểu mã hoá, số đơn vị đã dùng (septet hoặc đơn vị UTF-16; ký tự mở rộng ^ { } [ ] ~ | € \ tính hai), số tin và số ký tự còn lại trong tin cuối.

API liệt kê từng ký tự làm tin chuyển sang UCS-2 kèm mã Unicode, vị trí và ký tự thay thế gợi ý, đồng thời trả bản an toàn GSM: bỏ dấu tiếng Việt, thay dấu nháy cong, gạch dài, dấu ba chấm, bỏ emoji, kèm số tin của bản này và số tin tiết kiệm được. segments=true trả thêm nội dung từng phần, brandname kiểm tra tên thương hiệu gửi tin (tối đa 11 ký tự chữ và số).

Cách đếm theo 3GPP TS 23.038 / 23.040; nhà mạng có thể có thêm giới hạn riêng với tin brandname ghép nhiều phần.

Tham số

TênVị tríKiểuBắt buộcMặc định
textquery|bodystringcóNội dung tin nhắn (tối đa 20.000 ký tự).
segmentsquery|bodybooleankhôngfalsetrue: trả thêm nội dung từng phần tin.
brandnamequery|bodystringkhôngTên brandname cần kiểm tra (≤ 11 ký tự).

Ví dụ

curl -X POST "https://apibox.io.vn/v1/sms-count" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Mã OTP của bạn là 123456, hiệu lực 5 phút."}'

Kết quả trả về

{
  "encoding": "UCS-2",
  "characters": 42,
  "units": 42,
  "unit": "UTF-16 code units",
  "segments": 1,
  "per_segment": 70,
  "remaining_in_segment": 28,
  "ucs2_characters": [
    {
      "char": "ã",
      "codepoint": "U+00E3",
      "count": 1,
      "first_index": 1,
      "replacement": "a"
    },
    {
      "char": "ủ",
      "codepoint": "U+1EE7",
      "count": 1,
      "first_index": 8,
      "replacement": "u"
    },
    {
      "char": "ạ",
      "codepoint": "U+1EA1",
      "count": 1,
      "first_index": 12,
      "replacement": "a"
    },
    {
      "char": "ệ",
      "codepoint": "U+1EC7",
      "count": 1,
      "first_index": 28,
      "replacement": "e"
    },
    {
      "char": "ự",
      "codepoint": "U+1EF1",
      "count": 1,
      "first_index": 32,
      "replacement": "u"
    },
    {
      "char": "ú",
      "codepoint": "U+00FA",
      "count": 1,
      "first_index": 39,
      "replacement": "u"
    }
  ],
  "extension_characters": [],
  "gsm_version": {
    "encoding": "GSM-7",
    "characters": 42,
    "units": 42,
    "unit": "septets",
    "segments": 1,
    "per_segment": 160,
    "remaining_in_segment": 118,
    "text": "Ma OTP cua ban la 123456, hieu luc 5 phut.",
    "changed_characters": 7,
    "saves_segments": 0
  },
  "note": "Single SMS: 160 GSM-7 characters or 70 UCS-2 characters; concatenated parts carry a 7-byte header (153 / 67 per part). Characters of the GSM extension table (^ { } \\ [ ] ~ | €) count twice. Any Vietnamese accent forces UCS-2."
}

Ứng dụng

  • Hiển thị bộ đếm ký tự, số tin trong form gửi SMS
  • Giảm chi phí tin OTP, quảng cáo bằng cách bỏ dấu
  • Kiểm tra mẫu tin trước khi đăng ký với nhà mạng
  • Tìm ký tự ẩn khiến tin bị chuyển sang Unicode

Hỏi đáp

Vì sao chỉ một chữ có dấu đã thay đổi tất cả?

Chữ có dấu tiếng Việt (ă, ơ, ệ…) không có trong bảng GSM, nên cả tin chuyển sang UCS-2: 70 ký tự thay vì 160.

é, è, à có dùng được với GSM không?

Có, một số chữ Latin có dấu (é è ù ì ò à Ä Ö Ñ Ü…) nằm trong bảng GSM nên không làm tin chuyển sang UCS-2; bản an toàn GSM vẫn bỏ hết dấu như thói quen nhắn tin tiếng Việt.

Emoji được tính thế nào?

Theo UCS-2, và đa số emoji chiếm hai đơn vị UTF-16, nên 35 emoji đã đầy một tin.

API liên quan

Bắt đầu với 1.000 request miễn phí mỗi tháng. Nhận API key miễn phí →