Một lỗi rất hay gặp: website tiếng Việt lên hình toàn chữ loạn như áéÃóú hoặc các dấu hỏi, dấu chấm hỏi lạ thay cho chữ có dấu. Phần lớn trường hợp này không phải do font chữ, mà do thiếu hoặc sai khai báo bộ mã ký tự — gọi là charset. UTF 8 là gì? UTF-8 là một chuẩn mã hóa ký tự, quy định cách máy tính chuyển đổi giữa byte dữ liệu và ký tự hiển thị, hỗ trợ gần như mọi ngôn ngữ trên thế giới, trong đó có đầy đủ các ký tự có dấu của tiếng Việt.
Bài này giải thích vì sao thiếu khai báo UTF-8 làm vỡ chữ tiếng Việt, cách khai báo đúng vị trí trong HTML theo chuẩn kỹ thuật, và cách sửa lỗi ở hai tầng hay bị bỏ qua: cơ sở dữ liệu MySQL và WordPress.
Vì sao thiếu khai báo UTF-8 làm vỡ chữ tiếng Việt
Máy tính lưu trữ văn bản dưới dạng byte, không lưu trực tiếp chữ cái. Để hiển thị đúng, trình duyệt cần biết nên “dịch” chuỗi byte đó theo bảng mã nào. Nếu trang không khai báo rõ, hoặc khai báo một bảng mã khác với bảng mã thực tế đã dùng để lưu file, trình duyệt sẽ dịch sai — và với tiếng Việt có dấu, kết quả dịch sai thường là chuỗi ký tự lạ không đọc được, vì các ký tự có dấu nằm ngoài phạm vi bảng mã cơ bản (ASCII).
Khai báo UTF-8 đúng vị trí trong HTML
Theo chuẩn HTML Standard (WHATWG) và tài liệu MDN, cách khai báo đơn giản và được dùng phổ biến nhất là:
| Việc cần làm | Cách thực hiện |
|---|---|
| Thêm thẻ khai báo | <meta charset="utf-8"> đặt ngay trong phần <head> |
| Vị trí trong tài liệu | Phải nằm TRỌN VẸN trong 1024 byte đầu tiên của file HTML — nên đặt ngay sau thẻ mở <head>, trước cả thẻ <title> |
| Giá trị hợp lệ | Theo chuẩn HTML5, UTF-8 là giá trị hợp lệ duy nhất cho thuộc tính charset của thẻ meta |
| Lưu file nguồn | File HTML/PHP/mã nguồn cũng phải được LƯU ở định dạng UTF-8, khai báo đúng mà file lưu sai định dạng vẫn vỡ chữ |
Lý do bắt buộc đặt trong 1024 byte đầu: trình duyệt bắt đầu đọc và thử đoán bộ mã ngay từ những byte đầu tiên của file, trước khi đọc hết toàn bộ trang. Nếu khai báo charset nằm quá sâu trong file (ví dụ sau một đoạn CSS hoặc comment dài), trình duyệt có thể đã lỡ dùng bộ mã đoán sai để hiển thị phần đầu trang.
Cách kiểm tra trang đã khai báo đúng UTF-8 chưa
- Mở trang cần kiểm tra, bấm chuột phải chọn “Xem nguồn trang” (View Page Source).
- Dùng Ctrl+F tìm chuỗi “charset”.
- Kiểm tra có đúng dòng
<meta charset="utf-8">không, và dòng này có nằm gần đầu phần <head> không. - Nếu chữ tiếng Việt vẫn hiển thị sai dù đã có dòng khai báo đúng, nguyên nhân thường nằm ở tầng dữ liệu (cơ sở dữ liệu) chứ không phải ở HTML — xem phần tiếp theo.
Website đang gặp lỗi hiển thị chữ tiếng Việt không rõ nguyên nhân?
VIDCO kiểm tra đồng thời ba tầng: khai báo HTML, cấu hình cơ sở dữ liệu và cấu hình WordPress để tìm đúng chỗ gây lỗi.
Sửa lỗi UTF-8 ở tầng cơ sở dữ liệu MySQL
Đây là nguyên nhân hay bị bỏ qua nhất: trang web khai báo UTF-8 đúng, nhưng nội dung lấy từ cơ sở dữ liệu vẫn vỡ chữ, vì bảng dữ liệu trong MySQL đang dùng bộ mã khác hoặc một biến thể cũ của UTF-8.
| Bộ mã MySQL | Phạm vi hỗ trợ | Vấn đề thường gặp |
|---|---|---|
| latin1 | Chủ yếu ký tự Tây Âu cơ bản | Không lưu đúng được ký tự tiếng Việt có dấu, mất dữ liệu khi convert sai cách |
| utf8 (biến thể cũ của MySQL) | Unicode nhưng giới hạn tối đa 3 byte mỗi ký tự | Lưu được tiếng Việt có dấu thông thường, nhưng lỗi với một số ký tự đặc biệt/emoji cần 4 byte |
| utf8mb4 | Unicode đầy đủ, hỗ trợ ký tự cần tới 4 byte | Lựa chọn đúng và đầy đủ nhất hiện nay cho website đa ngôn ngữ, bao gồm tiếng Việt và emoji |
Khi gặp lỗi vỡ chữ xuất phát từ dữ liệu, cần kiểm tra bộ mã đang áp dụng ở cả ba cấp: cấp cơ sở dữ liệu (database), cấp bảng (table), và cấp cột (column) — đôi khi database đã đặt đúng utf8mb4 nhưng một vài bảng cũ vẫn còn ở bộ mã cũ. Việc chuyển đổi bộ mã cho dữ liệu đã có sẵn cần làm cẩn thận, nên ưu tiên sao lưu đầy đủ trước khi thực hiện, vì chuyển đổi sai cách có thể làm hỏng dữ liệu đã lưu (ký tự biến thành dấu hỏi hoặc ô vuông không phục hồi lại được).
Sửa lỗi UTF-8 trong WordPress
Với website WordPress, ngoài hai tầng trên, có thêm vài chỗ cần kiểm tra riêng:
- File wp-config.php: kiểm tra dòng khai báo
DB_CHARSETđang đặt là utf8mb4, không phải utf8 hoặc latin1. - Theme đang dùng: một số theme cũ tự chèn thêm thẻ meta charset riêng, gây xung đột với khai báo mặc định của WordPress — nên kiểm tra mã nguồn theme nếu nghi ngờ.
- Nhập/xuất dữ liệu (import/export): khi chuyển dữ liệu giữa hai hệ thống hoặc khôi phục từ file backup, cần đảm bảo cả file backup và database đích cùng dùng utf8mb4, tránh vỡ chữ ngay sau khi khôi phục.
- Plugin cache: một số plugin cache lưu lại bản HTML tĩnh — nếu đã sửa charset nhưng vẫn thấy lỗi cũ, nên xóa cache để tải lại bản mới.
Favicon, cache và các lỗi hiển thị dễ nhầm với lỗi charset
Không phải mọi lỗi hiển thị lạ trên website đều do charset. Vài trường hợp dễ nhầm:
- Favicon không hiện hoặc hiện sai: thường do đường dẫn file favicon sai hoặc thiếu khai báo thẻ link, không liên quan tới bộ mã ký tự — xem riêng trong bài favicon là gì.
- Trang hiện bản cũ dù đã sửa charset: do trình duyệt hoặc plugin cache giữ lại bản HTML cũ, cần xóa cache ở cả hai phía — xem thêm cách phân lớp cache trong bài web cache là gì.
- Một vài ký tự hiện ô vuông trống nhưng chữ thường vẫn đọc được: thường là thiếu font hỗ trợ riêng cho ký tự đó (ví dụ icon đặc biệt), không phải lỗi charset toàn trang.
Sai lầm hay gặp khi xử lý lỗi UTF-8
- Chỉ sửa thẻ meta mà không kiểm tra database: lỗi vẫn còn nếu nguyên nhân thực sự nằm ở tầng dữ liệu.
- Chuyển đổi bộ mã database không sao lưu trước: rủi ro mất dữ liệu nếu quá trình chuyển đổi gặp lỗi giữa đường.
- Nhầm lỗi font hiển thị với lỗi charset: nếu chữ hiện thành ô vuông trống thường là thiếu font hỗ trợ ký tự đó; nếu hiện thành chuỗi ký tự lạ (áé…) mới là lỗi charset thực sự.
- Đặt thẻ meta charset sau các thẻ khác trong head: vi phạm quy định phải nằm trong 1024 byte đầu, có thể khiến trình duyệt đã đoán sai bộ mã trước khi đọc tới dòng khai báo.
Nguồn tham khảo
Thông tin trong bài được đối chiếu với các nguồn chính thức dưới đây tại thời điểm biên soạn; văn bản và chính sách có thể thay đổi.
- Thẻ <meta> và thuộc tính charset (MDN)
- UTF-8 (MDN Glossary)
- HTML Standard – phần metadata (WHATWG)
- Nâng cấp utf8mb4 trong WordPress
Câu hỏi thường gặp
UTF 8 là gì, khác gì các bộ mã ký tự khác?
UTF-8 là một chuẩn mã hóa ký tự hỗ trợ gần như toàn bộ ngôn ngữ trên thế giới bằng cách dùng từ 1 đến 4 byte cho mỗi ký tự, trong khi các bộ mã cũ như latin1 chỉ hỗ trợ một phạm vi ký tự hẹp hơn, không đủ cho tiếng Việt có dấu.
Thẻ meta charset phải đặt ở đâu trong file HTML?
Phải nằm trọn vẹn trong 1024 byte đầu tiên của tài liệu, nên đặt ngay sau thẻ mở
và trước các thẻ khác như title theo khuyến nghị kỹ thuật.Vì sao đã khai báo UTF-8 nhưng chữ tiếng Việt vẫn lỗi?
Thường do tầng dữ liệu (cơ sở dữ liệu, bảng, hoặc cột) đang dùng bộ mã khác với UTF-8, hoặc file nguồn không được lưu đúng định dạng UTF-8 dù đã khai báo đúng trong HTML.
utf8 và utf8mb4 trong MySQL khác nhau thế nào?
utf8 trong MySQL là biến thể cũ, chỉ hỗ trợ tối đa 3 byte mỗi ký tự nên thiếu một số ký tự đặc biệt/emoji. utf8mb4 hỗ trợ đầy đủ tới 4 byte, là lựa chọn đúng và đầy đủ hơn cho website hiện nay.
Cần rà soát kỹ thuật tổng thể cho website đang gặp lỗi hiển thị?
VIDCO kiểm tra charset, cấu hình server và cơ sở dữ liệu, đề xuất hướng sửa phù hợp hệ thống bạn đang dùng.
Đọc thêm
Nguồn đối chiếu: developer.mozilla.org (thuộc tính charset của thẻ meta) và HTML Standard tại html.spec.whatwg.org — kiểm tra ngày 08/10/2026. Thao tác cụ thể trong WordPress hoặc trình quản trị cơ sở dữ liệu có thể khác nhau theo phiên bản; khi khác biệt, giao diện thật trên hệ thống của bạn là căn cứ cuối cùng.