Bỏ qua menu, tới nội dung

Byte UTF-8 là gì? Vì sao chữ tiếng Việt tốn 2 đến 3 byte

Byte UTF-8 là số ô nhớ mà một ký tự chiếm khi được lưu bằng bảng mã UTF-8. Cách mã hoá này dùng độ dài thay đổi: chữ Latinh không dấu tốn 1 byte, còn chữ tiếng Việt có dấu tốn 2 hoặc 3 byte tuỳ chữ đó nằm ở đâu trong bảng Unicode.

Mỗi chữ tiếng Việt tốn mấy byte

Chữ nằm càng xa đầu bảng mã thì càng tốn chỗ, và dấu thanh là thứ đẩy chữ đi xa.

Ký tựSố hiệuByte UTF-8
a, b, dấu cách, chữ sốU+0061 và lân cận1
á, à, ă, â, ê, ô, ơ, ư, đU+00E0–U+01B02
ạ, ả, ấ, ề, ệ, ộ, ợ, ứU+1EA0–U+1EF93
EmojiTừ U+1F300 trở lên4

Câu “Hôm nay trời đẹp. Tôi đi học!” có 29 ký tự nhưng 39 byte UTF-8. Nếu chữ “ệ” được gõ kiểu tổ hợp thay vì dựng sẵn, nó tốn 5 byte thay vì 3, nên chuẩn hoá NFC vừa giữ số ký tự ổn định vừa tiết kiệm chỗ lưu.

Khi nào bạn cần đếm byte

Byte UTF-8 quan trọng ở những nơi giới hạn được đặt theo dung lượng chứ không theo ký tự.

Cột VARCHAR(255) trong cơ sở dữ liệu, trường mô tả của một số API, tên tệp trên máy chủ và thẻ tiêu đề đều có thể tính theo byte. Một lập trình viên đặt giới hạn 100 ký tự cho ô tiêu đề sẽ thấy tiếng Việt có dấu chạm trần khi mới gõ được khoảng 40 chữ. Tin nhắn SMS thì đi đường khác: nó không đếm byte UTF-8 mà theo bảng mã GSM-7 hoặc UCS-2 trong 140 byte dữ liệu của mỗi tin.

Công cụ đếm byte UTF-8

Ba công cụ và một trang thuật ngữ sau làm việc với các đơn vị lưu trữ.

  • Đếm byte UTF-8 hiện byte, code point, grapheme và bảng ký tự tốn hơn 1 byte.
  • Đếm ký tự SMS quy đổi cùng đoạn chữ sang sức chứa của một tin nhắn.
  • Bỏ dấu tiếng Việt kéo mọi chữ về dải 1 byte khi hệ thống nhận chật chội.
  • Code point phân biệt số hiệu Unicode với số byte thật sự lưu xuống.