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

Đếm byte UTF-8, UTF-16 của văn bản: vì sao chữ ệ tốn tới 3 byte

Kiểm tra: 16/09/2026Nguồn: Căn cứ và nguồnChạy trên trình duyệt, không lưu dữ liệu

Đang tải công cụ…

Đếm byte cho biết văn bản nặng bao nhiêu khi lưu dạng UTF-8: chữ không dấu 1 byte, â, ê, ô, ơ, ư, đ 2 byte, chữ mang dấu thanh như “ệ” 3 byte, emoji 4 byte mỗi code point. Cùng lúc công cụ báo số đơn vị UTF-16 (String.length), code point, grapheme, byte UTF-16 và số byte nếu văn bản bị gõ kiểu tổ hợp. Mọi phép đếm chạy trên trình duyệt, không lưu dữ liệu.

Cách đếm byte UTF-8 của từng ký tự

Văn bản được chuẩn hoá NFC, mã hoá bằng TextEncoder của trình duyệt, rồi từng ký tự được xếp vào nhóm 1, 2, 3 hoặc 4 byte.

  1. Chuẩn hoá NFC để chữ có dấu ở dạng dựng sẵn, giống cách site đếm ở mọi công cụ.
  2. TextEncoder chuyển văn bản sang UTF-8; tổng số byte cũng là dung lượng ước tính của file .txt, chưa gồm BOM.
  3. String.length cho số đơn vị UTF-16; nhân 2 ra byte UTF-16.
  4. Array.from đếm code point, Intl.Segmenter đếm grapheme (ký tự nhìn thấy).
  5. Văn bản được chuyển thử sang NFD để báo số byte nếu nó bị gõ kiểu tổ hợp.
  6. Bảng “Ký tự chiếm hơn 1 byte” liệt kê mã U+, dãy byte hex, số lần xuất hiện và tổng byte của từng ký tự.
Dải mã UnicodeByte UTF-8Ký tự tiếng Việt thuộc dải
U+0000–U+007F1a–z, A–Z, 0–9, dấu cách, dấu chấm, dấu phẩy
U+0080–U+07FF2à á â ã è é ê ì í ò ó ô õ ù ú ý ă đ ĩ ũ ơ ư
U+0800–U+FFFF3ạ ả ấ ầ ẩ ẫ ậ ắ ằ ẻ ẽ ệ ỉ ọ ỏ ộ ớ ờ ợ ụ ủ ứ ừ ỳ ỹ…, ký hiệu ₫, ngoặc kép cong
U+10000–U+10FFFF4phần lớn emoji

Nói gọn: chữ có dấu nằm trong bảng Latin-1 và Latin mở rộng tốn 2 byte, còn các chữ dấu thanh dựng sẵn ở khối U+1EA0–U+1EF9 tốn 3. Khái niệm được giải thích thêm ở trang byte UTF-8, còn quy tắc chuẩn hoá chung ở phương pháp đếm.

Ví dụ: lỗi cột VARCHAR khi lưu họ tên có dấu

Họ tên “Nguyễn Thị Phương Thảo” có 22 ký tự nhưng 30 byte UTF-8; một cột đo độ dài theo byte mà đặt 22 sẽ cắt tên hoặc báo lỗi.

Văn bảnByte UTF-8Đơn vị UTF-16Code pointGraphemeByte nếu gõ tổ hợp
Hôm nay trời đẹp. Tôi đi học!3929292943
Mẫu B (2 đoạn, 25 chữ)153112112112187
ệ31115
Nguyễn Thị Phương Thảo3022222234
“Ok” + dấu cách + 1 emoji mặt cười75447

Ba dòng đầu nằm trong bộ kiểm thử. Mẫu A gồm 22 ký tự 1 byte, 4 ký tự 2 byte (hai chữ ô, hai chữ đ) và 3 ký tự 3 byte (ờ, ẹ, ọ): 22 + 8 + 9 = 39. Ở họ tên, ễ, ị, ả mỗi chữ 3 byte, ư và ơ mỗi chữ 2 byte, nên 22 ký tự thành 30 byte. Bảng chi tiết trên công cụ còn in dãy hex, ví dụ “ệ” là E1 BB 87, tiện so với log lỗi.

Chỗ lập trình viên hay vấp là mỗi hệ quản trị hiểu độ dài cột một kiểu. Oracle mặc định đo VARCHAR2 theo byte, nên VARCHAR2(22) không chứa nổi tên trên. MySQL với bảng mã utf8mb4 đo VARCHAR theo ký tự, nhưng bảng mã utf8 cũ (utf8mb3) chỉ nhận tối đa 3 byte mỗi ký tự và báo lỗi khi gặp emoji 4 byte. Dòng cuối cho thấy một emoji là đủ gây lỗi đó. Thuộc tính maxlength của ô nhập HTML lại đếm theo đơn vị UTF-16, nên emoji mặt cười chiếm 2.

Tôi luôn đếm byte trước khi chốt độ dài cột, tên file hay trường API nhận tiếng Việt, vì số ký tự nhìn thấy gần như không bao giờ là con số hệ thống kiểm tra. Cấu hình cụ thể của từng phiên bản cơ sở dữ liệu vẫn nên đối chiếu với tài liệu của nhà phát triển.

Trường hợp đặc biệt: gõ tổ hợp, BOM và xuống dòng

Cùng chữ “ệ” có thể là 3 hoặc 5 byte, tuỳ nó được gõ dựng sẵn hay tổ hợp từ chữ e và hai dấu rời.

Dạng tổ hợp (NFD) gồm e (1 byte), dấu mũ U+0302 (2 byte) và dấu nặng U+0323 (2 byte). Văn bản dán từ vài bộ gõ hoặc phần mềm cũ có thể mang dạng này. Hai chuỗi trông giống hệt nhau nhưng khác byte, nên truy vấn tìm kiếm không khớp hoặc hệ thống cho phép hai tài khoản “trùng” tên. Công cụ đếm byte chính sau khi đã chuẩn hoá NFC và hiện riêng số byte nếu gõ tổ hợp: Mẫu A từ 39 lên 43 byte, từ 29 lên 35 code point.

BOM là 3 byte EF BB BF một số trình soạn thảo chèn vào đầu file UTF-8. Dung lượng file .txt công cụ báo không gồm BOM. Nếu văn bản bạn dán có sẵn ký tự U+FEFF, nó được đếm 3 byte và công cụ phát hiện ký tự ẩn sẽ tìm ra.

Xuống dòng trong ô nhập của trình duyệt luôn là 1 ký tự LF, tức 1 byte. File lưu trên Windows thường dùng CR LF, 2 byte mỗi dòng, nên văn bản 100 dòng có thể nặng hơn con số trên công cụ 100 byte.

Công cụ liên quan

  • Đếm ký tự online khi hệ thống giới hạn theo ký tự nhìn thấy chứ không theo byte.
  • Đếm emoji tách từng emoji ghép thành số code point và byte, cần khi cột cơ sở dữ liệu từ chối emoji.
  • Tìm ký tự ẩn xoá BOM, zero-width space và NBSP làm lệch số byte.
  • Xoá dấu tiếng Việt đưa mọi chữ về 1 byte khi trường nhập chỉ nhận ASCII.
  • Ước lượng token AI cho thấy tiếng Việt có dấu thường tốn token hơn tiếng Anh, một phần vì bộ tách token làm việc trên byte UTF-8.

Câu hỏi thường gặp

1 ký tự tiếng Việt bao nhiêu byte?

Từ 1 đến 3 byte trong UTF-8. Chữ không dấu là 1 byte; à, á, â, ê, ô, ơ, ư, ă, đ là 2 byte; chữ mang dấu thanh dựng sẵn như ạ, ả, ệ, ộ, ừ là 3 byte. Trong UTF-16 mọi chữ tiếng Việt dựng sẵn đều là 2 byte. Văn bản thường như Mẫu B trung bình khoảng 1,37 byte mỗi ký tự.

Vì sao String.length khác số ký tự nhìn thấy?

String.length trong JavaScript đếm đơn vị UTF-16, không đếm ký tự nhìn thấy. Chữ tiếng Việt dựng sẵn là 1 đơn vị nên thường khớp, nhưng mỗi emoji mặt cười là 2 và emoji gia đình là 8. Văn bản gõ tổ hợp cũng làm length tăng vì mỗi dấu rời là 1 đơn vị. Công cụ hiện cả hai số để bạn so.

VARCHAR(255) chứa được bao nhiêu ký tự tiếng Việt?

Tuỳ cột đo theo ký tự hay theo byte. Đo theo ký tự thì đủ 255 ký tự dù có dấu. Đo theo byte thì với văn bản như Mẫu B, trung bình 1,37 byte mỗi ký tự, 255 byte chứa khoảng 186 ký tự; họ tên nhiều dấu thanh còn ít hơn. Dán dữ liệu mẫu dài nhất vào công cụ để thấy số byte thật.

Dung lượng file txt 1.000 chữ tiếng Việt là bao nhiêu?

Khoảng 6 KB theo ước tính. Mẫu B có 25 chữ và 153 byte UTF-8, tức hơn 6 byte mỗi chữ kể cả dấu cách và dấu câu; 1.000 chữ như vậy vào khoảng 6.100 byte. Văn bản nhiều dấu thanh hoặc lưu kèm BOM và xuống dòng kiểu Windows sẽ nặng hơn một chút.

Bỏ dấu tiếng Việt có giảm số byte không?

Có. Khi bỏ dấu, mọi chữ đều về dải 1 byte. Mẫu A “Hôm nay trời đẹp. Tôi đi học!” nặng 39 byte, bản không dấu “Hom nay troi dep. Toi di hoc!” chỉ còn 29 byte, bằng đúng số ký tự. Đổi lại người đọc mất thông tin, nên chỉ nên bỏ dấu ở trường kỹ thuật như slug, tên file hay mã tham chiếu.

Căn cứ và nguồn

Kiểm tra: 16/09/2026. Hành vi của Oracle, MySQL và thuộc tính maxlength nêu ở trên là cấu hình mặc định phổ biến; phiên bản và thiết lập riêng có thể khác.

Mục lục
  1. Cách đếm byte UTF-8 của từng ký tự
  2. Ví dụ: lỗi cột VARCHAR khi lưu họ tên có dấu
  3. Trường hợp đặc biệt: gõ tổ hợp, BOM và xuống dòng
  4. Công cụ liên quan
  5. Câu hỏi thường gặp
  6. Căn cứ và nguồn