“Tôi muốn nhét cả đoạn giới thiệu công ty vào một mã QR, có được không?” Đây là câu tôi nhận nhiều nhất từ những người mới bắt đầu làm mã.
Được, về mặt kỹ thuật. Một mã QR chứa tối đa 7.089 chữ số, hoặc 4.296 ký tự chữ và số, hoặc 2.953 byte nếu dùng chế độ byte — mà tiếng Việt có dấu thì thuộc chế độ byte và mỗi chữ cái có dấu ngốn tới ba byte. Nhưng đó là con số ở phiên bản 40, lưới 177×177 ô, mức sửa lỗi thấp nhất. Một mã như vậy in dưới khổ A5 thì camera điện thoại gần như bó tay.
Con số bạn nên nhớ khác hẳn: dưới 300 ký tự nếu muốn quét dễ, dưới 100 nếu in nhỏ hơn 3 cm, và với đường link thì càng ngắn càng tốt. Phần dưới giải thích vì sao hai con số này lệch nhau xa đến thế, kèm bảng tra dung lượng theo phiên bản để bạn tự đối chiếu. Muốn kiểm chứng ngay thì hãy tạo một mã QR văn bản và gõ thêm chữ dần dần — lưới ô dày lên trước mắt.
Dung lượng tối đa theo bốn chế độ mã hóa
Mã QR nén dữ liệu theo bốn chế độ, và cùng một mã chứa được nhiều chữ số hơn hẳn so với chữ có dấu. Lý do: mỗi chế độ dùng số bit khác nhau cho một ký tự. Các con số dưới đây lấy từ đặc tả của Denso Wave, đơn vị phát minh mã QR năm 1994, và trùng với chuẩn ISO/IEC 18004 bản 2015.
| Chế độ | Ký tự dùng được | Bit mỗi ký tự | Tối đa ở phiên bản 40, mức L |
|---|---|---|---|
| Số | 0–9 | khoảng 3,33 | 7.089 chữ số |
| Chữ và số | A–Z in hoa, 0–9, chín ký tự đặc biệt | 5,5 | 4.296 ký tự |
| Byte | Mọi ký tự, gồm chữ thường và tiếng Việt có dấu | 8 mỗi byte | 2.953 byte |
| Kanji | Chữ Nhật | 13 | 1.817 ký tự |
Chỗ này người Việt hay hụt hẫng: chữ có dấu tốn gấp ba lần chữ không dấu. Chuỗi “Công ty TNHH Thương mại Dịch vụ” dài 30 ký tự nhưng chiếm khoảng 40 byte vì mỗi chữ ơ, ư, ị đều là ba byte trong bảng mã UTF-8. Viết không dấu cho phần địa chỉ và tên là mẹo tiết kiệm dung lượng đơn giản nhất.
Bảng tra dung lượng theo phiên bản
Phiên bản quyết định kích thước lưới, và lưới quyết định chứa được bao nhiêu. Phiên bản 1 là 21×21 ô, mỗi phiên bản kế tiếp cộng 4 ô mỗi cạnh, tới phiên bản 40 là 177×177 ô. Bảng dưới lấy vài mốc hay gặp, ở mức sửa lỗi M — mức mặc định của phần lớn công cụ tạo mã.
| Phiên bản | Lưới ô | Chữ số | Chữ và số | Byte |
|---|---|---|---|---|
| 1 | 21×21 | 34 | 20 | 14 |
| 3 | 29×29 | 93 | 58 | 40 |
| 5 | 37×37 | 182 | 106 | 78 |
| 10 | 57×57 | 513 | 311 | 213 |
| 20 | 97×97 | 1.600 | 970 | 666 |
| 40 | 177×177 | 5.596 | 3.391 | 2.331 |
Nhìn cột cuối sẽ thấy điều đáng chú ý hơn cả con số: từ phiên bản 10 trở lên, lưới đã 57 ô mỗi cạnh. In mã đó ở 3 cm thì mỗi ô chỉ còn hơn nửa milimét — đúng ngưỡng camera điện thoại bắt đầu đọc chập chờn.
Vì sao mã dài lại khó quét
Nội dung càng dài, lưới càng nhiều ô, mỗi ô càng nhỏ ở cùng một kích thước in. Camera điện thoại cần mỗi ô đạt khoảng 0,5 mm trở lên để phân biệt được sáng với tối; xuống dưới ngưỡng đó thì các ô nhòe vào nhau và số bit đọc sai vượt quá khả năng sửa lỗi.
Nhân thử cho dễ hình dung. Mã phiên bản 3 in 3 cm cho mỗi ô khoảng 1 mm — thoải mái. Cùng khổ 3 cm mà là phiên bản 15 với 77 ô mỗi cạnh thì mỗi ô còn 0,39 mm, và bạn sẽ thấy khách phải zoom camera, lùi tới lùi lui.
Mức sửa lỗi cũng ăn vào dung lượng. Chuyển từ mức L lên mức H, phần dành cho nội dung giảm khoảng một nửa, nên cùng một chuỗi ký tự sẽ đẩy mã lên phiên bản cao hơn và dày ô hơn, xem bài mức sửa lỗi L, M, Q, H.
Còn một yếu tố nữa ít được nhắc: khả năng lấy nét của camera. Điện thoại đời mới lấy nét ở khoảng cách 8–10 cm, nên khách phải đưa máy khá gần mới đọc được mã dày, và ở khoảng cách đó thì tay run làm ảnh nhòe. Máy cũ lấy nét kém hơn nữa. Đây là lý do một mã dày có thể quét được trên bàn làm việc nhưng thất bại khi khách đứng ở quầy.
Kinh nghiệm của tôi: nếu mã phải quét trong lúc người ta vội — ở quầy thu ngân, ở cổng sự kiện — hãy giữ nội dung ngắn nhất có thể, kể cả khi phải hy sinh vài thông tin. Ba giây chờ quét lại làm khách khó chịu hơn nhiều so với việc thiếu một dòng địa chỉ.
Ngưỡng thực tế cho từng loại nội dung
Con số tôi dùng khi tư vấn, đã tính cả chuyện in và chuyện quét bằng máy cũ.
- Đường link: giữ dưới 80 ký tự. Link Google Drive hay link có tham số theo dõi thường dài 100–200 ký tự, nên rút gọn trước khi tạo mã.
- Văn bản thuần tiếng Việt: dưới 200 ký tự nếu in từ 4 cm trở lên, dưới 100 nếu in nhỏ hơn.
- Danh thiếp vCard: chỉ giữ tên, một số điện thoại, một email, tên công ty. Nhét thêm địa chỉ đầy đủ và website là mã dày lên thấy rõ.
- Mã WiFi: gần như không phải lo, vì tên mạng cộng mật khẩu hiếm khi quá 60 ký tự.
- Mã VietQR: chuỗi EMVCo thường 100–150 ký tự, nằm trong vùng an toàn kể cả khi thêm số tiền và nội dung chuyển khoản.
Ngưỡng an toàn gói trong một câu
Dưới 300 ký tự thì quét dễ, dưới 100 ký tự thì in nhỏ vẫn được, còn trên 500 ký tự là bạn đang tự làm khó khách của mình. Ba mốc đó đủ dùng cho gần như mọi việc hằng ngày.
Ba cách rút ngắn nội dung mà không mất thông tin
Cách hiệu quả nhất là chuyển nội dung dài lên một trang web và chỉ mã hóa đường link. Mã chứa 40 ký tự thay vì 2.000, lưới thưa hẳn, và bạn còn sửa được nội dung sau này mà không phải in lại mã — miễn là đường link giữ nguyên.
Cách thứ hai là bỏ dấu tiếng Việt ở những chỗ không ảnh hưởng: tên riêng viết hoa không dấu, địa chỉ viết tắt. Đây cũng là cách chuẩn VietQR làm với tên chủ tài khoản, không phải ngẫu nhiên.
Cách thứ ba ít ai để ý: bỏ phần https://www. khi nhập link nếu công cụ tạo mã cho phép, và ưu tiên tên miền ngắn. Mỗi ký tự cắt được đều đẩy mã về phiên bản thấp hơn một chút, và tới một ngưỡng nào đó là tụt hẳn một phiên bản.
Vậy nên làm gì
Đừng lấy 7.089 làm mục tiêu. Câu chuyện của bài này đi từ dung lượng lý thuyết theo bốn chế độ mã hóa, qua bảng phiên bản cho thấy lưới dày lên nhanh thế nào, tới ngưỡng thật mà camera điện thoại còn đọc thoải mái — và ngưỡng thật thấp hơn con số quảng cáo cả chục lần.
Quan điểm của tôi sau nhiều lần dựng mã cho quán và văn phòng: dữ liệu càng ít, mã càng thưa, khách quét càng nhanh, và bạn càng in nhỏ được. Nếu đang định nhét cả đoạn văn vào mã, hãy thử gõ đoạn đó vào công cụ tạo mã QR văn bản rồi in thử ở đúng khổ định dùng và quét bằng chiếc điện thoại cũ nhất trong nhà. Bạn sẽ thấy ngưỡng của mình nằm ở đâu nhanh hơn mọi bảng tra. Còn nếu nội dung thật sự dài, hãy đẩy nó lên một trang và tạo mã QR cho đường link thay vì cho toàn bộ đoạn văn.
Vài câu hỏi thêm
Mã QR chứa được ảnh hoặc file PDF không
Không. Mã QR chỉ chứa văn bản, nên thứ nằm trong mã là đường link tới ảnh hoặc file, còn bản thân file vẫn ở trên mạng. Đây là lý do mã “chứa” menu quán thực chất chỉ chứa link Google Drive.
Tiếng Việt có dấu tốn bao nhiêu dung lượng trong mã QR
Mỗi chữ cái có dấu chiếm ba byte trong bảng mã UTF-8, so với một byte cho chữ không dấu. Một câu 100 ký tự tiếng Việt đầy đủ dấu có thể chiếm 200–250 byte, gần gấp đôi so với cùng câu viết không dấu.
Vì sao mã QR của tôi dày ô hơn mã của người khác dù nội dung ngắn hơn
Thường do mức sửa lỗi. Nếu bạn chọn mức H để chèn logo còn họ để mức L, mã của bạn sẽ dày hơn hẳn dù nội dung ngắn hơn. Một khả năng khác là công cụ của bạn thêm sẵn tiền tố như https:// hoặc tham số theo dõi vào link.
Mã QR có giới hạn số dòng khi nhập nhiều đoạn văn không
Không có giới hạn theo dòng, chỉ có giới hạn theo tổng số byte. Nhưng ký tự xuống dòng cũng tính là một byte mỗi lần, nên một danh sách 30 dòng ngắn tốn thêm 30 byte chỉ cho việc xuống dòng.