Chủ Nhật, 19 tháng 7, 2026

UTF-8 và bi kịch tiếng Việt bị lỗi font (Vì sao "Xin chào" lại biến thành "Xin chà o"?)

Gần như ai làm website tiếng Việt cũng từng gặp: "Xin chào" biến thành "Xin chà o", dấu hỏi thành ký tự lạ, dữ liệu trong MySQL hiển thị đúng nhưng trình duyệt sai (hoặc ngược lại).

Có một lỗi.

Mình dám chắc.

99% lập trình viên Việt Nam.

Đều từng gặp.

😄

Bạn nhập vào database:

Xin chào các bạn!

Mọi thứ đều đúng.

Upload website.

Refresh.

...

Website hiện:

Xin chà o các bạn!

🤡

Hoặc.

Ti?ng Vi?t

Hoặc.

Xin ch�o

😭

Bạn bắt đầu nghĩ.

"Database hỏng."

"PHP bị lỗi."

"MySQL không hỗ trợ tiếng Việt."

😅

Không.

Thủ phạm thường chỉ có một.

Encoding.

Hay nói cụ thể hơn.

UTF-8.


UTF-8 là gì?

UTF-8 là chuẩn mã hóa ký tự (Character Encoding) phổ biến nhất hiện nay.

Nó giúp máy tính hiểu và lưu trữ văn bản của nhiều ngôn ngữ khác nhau như:

  • Tiếng Việt
  • Tiếng Anh
  • Tiếng Nhật
  • Tiếng Hàn
  • Emoji 😀

Nếu website, PHP, MySQL và trình duyệt không cùng sử dụng một chuẩn mã hóa, văn bản có thể bị lỗi font hoặc hiển thị sai.



Ví dụ đời thường 📦

Hãy tưởng tượng.

Bạn gửi cho bạn mình một chiếc chìa khóa.

😄

Nhưng.

Ổ khóa hai bên.

Không cùng loại.

Chìa khóa đúng.

Ổ khóa đúng.

Nhưng.

Không mở được.

Encoding cũng giống như vậy.

Nếu hai bên không dùng cùng "bảng mã".

Máy tính sẽ đọc sai.


Máy tính không hiểu tiếng Việt 😄

Thực ra.

Máy tính chỉ hiểu:

0

1

Mọi thứ.

Từ:

A.

B.

C.

😀

Đến:

"Đặng."

"Nguyễn."

"Quảng Trị."

Đều phải được mã hóa thành các con số.

UTF-8 chính là "quy ước" để mọi người cùng hiểu những con số đó.


Vì sao lại thành "Chà o"?

Ví dụ.

Bạn lưu:

Chào

Bằng:

UTF-8.

😄

Nhưng.

Trình duyệt lại đọc bằng:

ISO-8859-1.

Nó sẽ hiểu sai.

Xuất hiện:

Chà o

Không phải dữ liệu bị hỏng.

Mà là...

Đọc sai bảng mã.


Muốn tiếng Việt hiển thị đúng...

Có tới 4 nơi phải cùng "nói chung một ngôn ngữ".

😄

1. File PHP

Nên lưu bằng:

UTF-8

Không nên:

ANSI.


2. HTML

Trong phần <head>.

Nên có:

<meta charset="UTF-8">

Nếu thiếu.

Trình duyệt có thể đoán sai.


3. MySQL

Database.

Table.

Column.

Nên dùng:

utf8mb4

Đây là chuẩn được khuyến nghị hiện nay.


4. Kết nối PHP với MySQL

Ví dụ.

Sau khi kết nối.

Nên thiết lập đúng charset.

Nếu không.

Database lưu đúng.

Nhưng PHP đọc sai.

😭


utf8 và utf8mb4 khác nhau?

Đây là điều rất nhiều người mới chưa biết.

MySQL có:

utf8

và.

utf8mb4

😄

Tên gần giống.

Nhưng.

Không giống hoàn toàn.

Ngày nay.

Nếu tạo database mới.

Hãy ưu tiên:

utf8mb4

Nó hỗ trợ đầy đủ Unicode.

Kể cả Emoji.

😀🎉🚀


InfinityFree Case 😅

Có bạn gửi mình project.

Tiếng Anh.

Hiển thị bình thường.

😄

Tiếng Việt.

Toàn thành:

á

ế

ư

🤡

Kiểm tra.

Database.

UTF-8.

PHP.

UTF-8.

Cuối cùng phát hiện.

Thiếu:

<meta charset="UTF-8">

Chỉ thêm một dòng.

Mọi thứ trở lại bình thường.


Một hiểu lầm rất phổ biến 🤡

Nhiều người nghĩ.

Chỉ cần database dùng UTF-8.

Là đủ.

Không.

😄

Hãy nhớ.

Website giống một cuộc gọi điện thoại.

Nếu một bên nói tiếng Việt.

Một bên nghe tiếng Nhật.

Hiểu sai.

Không phải vì người nói sai.

Mà vì hai bên không cùng ngôn ngữ.


Khi nào nên nghi ngờ UTF-8?

✔ Chỉ tiếng Việt bị lỗi

✔ Tiếng Anh vẫn bình thường

✔ Database nhìn đúng nhưng website sai

✔ Website đúng nhưng phpMyAdmin sai

✔ Emoji biến mất

✔ Dấu tiếng Việt thành ký tự lạ

Nếu có các dấu hiệu này.

Đừng sửa từng chữ.

Hãy kiểm tra Encoding.


Một mẹo cực hay 😎

Nếu bắt đầu một project mới.

Hãy thống nhất ngay từ đầu:

✔ File lưu UTF-8

✔ HTML dùng UTF-8

✔ Database dùng utf8mb4

✔ PHP kết nối đúng charset

Làm vậy.

Bạn gần như không bao giờ gặp lỗi font nữa.


Debug kiểu dev thật 😎

✅ 1. Kiểm tra file bằng VS Code

Góc dưới bên phải.

Có hiển thị:

UTF-8

Hay không.

✅ 2. Kiểm tra meta charset

Đây là thứ bị quên nhiều nhất.

✅ 3. Kiểm tra phpMyAdmin

Database.

Table.

Collation.

Có đang dùng utf8mb4 không?

✅ 4. Kiểm tra kết nối MySQL

Đừng chỉ kiểm tra dữ liệu.

Hãy kiểm tra luôn cách PHP đọc dữ liệu.

✅ 5. Đừng sửa từng ký tự

Nếu thấy hàng loạt chữ bị lỗi.

99% là lỗi Encoding.


Checklist chuẩn không cần chỉnh 😎

☑ File PHP lưu UTF-8

☑ HTML có <meta charset="UTF-8">

☑ Database dùng utf8mb4

☑ PHP kết nối đúng charset

☑ Kiểm tra Collation

☑ Không dùng nhiều bảng mã khác nhau trong cùng project


FAQ nhanh

UTF-8 là gì?

→ Là chuẩn mã hóa ký tự phổ biến nhất hiện nay.

utf8 và utf8mb4 nên dùng cái nào?

→ Với project mới, nên dùng utf8mb4.

Vì sao tiếng Anh đúng mà tiếng Việt sai?

→ Vì tiếng Anh chỉ dùng ký tự ASCII cơ bản, còn tiếng Việt cần mã hóa đầy đủ.

Emoji bị mất có liên quan UTF-8 không?

→ Có. Nhiều trường hợp cần dùng utf8mb4 để lưu đầy đủ Emoji.


Bạn có thể cũng đang gặp 😭

👉 localhost vs hosting khác nhau thế nào?

👉 Vì sao Windows chạy nhưng Linux host chết?

👉 Header already sent là gì?

👉 Cache là gì? (Vì sao sửa code rồi mà website vẫn không thay đổi?)

👉 Session vs Cookie - Hai anh em dễ nhầm nhất của PHP

👉 Backup database đúng cách trước khi "toang"


Tổng kết

Lỗi font tiếng Việt không phải vì PHP ghét tiếng Việt.

Cũng không phải vì MySQL "không biết nói tiếng Việt".

😄

Nó giống như việc hai người đang nói chuyện.

Một người dùng tiếng Việt.

Một người lại mang theo... từ điển tiếng Pháp.

Kết quả.

Ai cũng nói đúng.

Nhưng chẳng ai hiểu ai.

UTF-8 chính là "ngôn ngữ chung" giúp:

PHP.

MySQL.

Trình duyệt.

Editor.

Đều hiểu giống nhau.

Và nếu bạn chỉ nhớ một điều từ bài này, hãy nhớ:

Đừng chỉ hỏi "Dữ liệu có đúng không?".

Hãy hỏi thêm: "Mọi thành phần trong project có đang dùng cùng một bảng mã không?"

Chỉ cần thống nhất UTF-8 (tốt nhất là utf8mb4) ngay từ đầu, bạn sẽ tránh được một trong những "bi kịch quốc dân" của lập trình viên Việt Nam. 😄