Lưu LoátWiki
Tìm
Bảng mã & Unicode

Vì sao chữ Việt hiện thành ký tự lạ kiểu "Việt" và cách sửa

Chữ Việt thành "Việt" vì văn bản UTF-8 bị đọc bằng bảng mã Windows-1252. Bảng nhận dạng các kiểu lỗi, tình huống CSV, web, email và cách sửa đúng thứ tự.

Vì sao chữ Việt hiện thành ký tự lạ kiểu "Việt" và cách sửa

Chữ Việt hiện thành "Việt" là vì văn bản được lưu bằng UTF-8 nhưng phần mềm lại đọc bằng một bảng mã châu Âu (thường là Windows-1252 hoặc Latin-1): mỗi chữ có dấu chiếm 2–3 byte trong UTF-8, và phần mềm hiểu nhầm mỗi byte là một chữ riêng. Dữ liệu thật ra chưa hỏng; chỉ cần mở lại với đúng bảng mã UTF-8 là chữ trở về như cũ. Hỏng thật là khi tệp bị lưu đè ở trạng thái sai, hoặc bị chuyển mã thêm lần nữa.

Hiện tượng này có tên: mojibake

Giới lập trình gọi hiện tượng chữ hiện thành ký tự vô nghĩa là "mojibake" — từ tiếng Nhật, đại ý "chữ biến hình". Người Nhật gặp chuyện này thường xuyên vì có nhiều bảng mã cạnh tranh, và tiếng Việt cũng vậy.

Nguyên lý luôn là một: người ghi và người đọc dùng hai bảng mã khác nhau. Các con số (byte) vẫn nguyên, nhưng bảng tra để biến số thành chữ thì sai.

Giải phẫu chữ "Việt"

Chữ "ệ" có số hiệu Unicode U+1EC7. Khi lưu bằng UTF-8, nó thành ba byte: E1, BB, 87. Một phần mềm đọc theo Windows-1252 sẽ tra từng byte một:

ByteTheo UTF-8 (đúng)Theo Windows-1252 (sai)
E1byte 1 của chữ "ệ"á
BBbyte 2 của chữ "ệ"»
87byte 3 của chữ "ệ"‡

Vậy "Việt" (V, i, ệ, t) thành "V", "i", "á", "»", "‡", "t" — tức "Việt". Chữ không dấu như V, i, t chỉ tốn 1 byte và trùng nhau ở mọi bảng mã, nên vẫn hiện đúng. Đó là lý do câu bị lỗi trông "nửa đúng nửa sai".

Bảng nhận dạng các kiểu lỗi hay gặp

Bạn thấyĐúng ra làChuyện gì đã xảy ra
Tiếng Việt có dấuTiếng Việt có dấuUTF-8 bị đọc bằng Windows-1252 / Latin-1
Tiếng ViệtTiếng ViệtBị đọc sai rồi lưu lại thành UTF-8, sau đó lại đọc sai lần nữa (lỗi chồng lỗi)
Ti?ng Vi?tTiếng ViệtBị chuyển sang một bảng mã không có chữ Việt; chữ có dấu bị thay bằng dấu hỏi — mất hẳn
Ti�ng Vi�tTiếng ViệtPhần mềm đọc UTF-8 nhưng dữ liệu không phải UTF-8 hợp lệ (thường là bảng mã cũ), thay bằng ký tự thay thế �
Céng hoµ, ViÖt NamCộng hoà, Việt NamVăn bản TCVN3 hiện bằng phông thường
Coäng hoøa, Vieät NamCộng hòa, Việt NamVăn bản VNI hiện bằng phông thường
Ô vuông trống ☐ thay cho chữ(tuỳ)Dữ liệu đúng, nhưng phông chữ không có hình cho ký tự đó

Hai dòng cuối bảng thuộc về bảng mã cũ và phông chữ; chúng có bài riêng. Bài này tập trung vào lỗi UTF-8 đọc sai — kiểu phổ biến nhất hiện nay.

Những tình huống hay gặp nhất

Mở tệp CSV bằng Excel

Phần mềm bán hàng, biểu mẫu trực tuyến, hệ thống quản lý xuất dữ liệu ra tệp CSV bằng UTF-8. Nhấp đúp mở bằng Excel trên Windows, cột tên khách hàng hiện thành "Nguyá»…n". Lý do: tệp không có dấu hiệu nhận biết UTF-8 ở đầu (BOM), Excel đoán theo bảng mã mặc định của máy.

Cách mở đúng: không nhấp đúp, mà dùng chức năng nhập dữ liệu từ tệp văn bản/CSV trong thẻ Data, chọn nguồn gốc tệp là UTF-8 (thường ghi "65001: Unicode (UTF-8)"). Khi tự xuất CSV cho người khác mở bằng Excel, chọn kiểu lưu "CSV UTF-8" nếu có.

Trang web hiện chữ lỗi

Trang web không khai báo bảng mã, hoặc khai báo sai (ví dụ khai ISO-8859-1 trong khi tệp là UTF-8). Người làm web cần đặt charset=UTF-8 ở cả phần đầu trang lẫn cấu hình máy chủ. Người đọc thì có thể thử trình duyệt khác; các trình duyệt hiện đại đã bỏ phần lớn nút đổi bảng mã thủ công.

Email tiêu đề lỗi

Thư gửi từ phần mềm cũ hoặc cấu hình sai bảng mã, đến hộp thư với tiêu đề toàn ký tự lạ. Thường lỗi nằm ở phía người gửi; báo họ kiểm thiết lập bảng mã của phần mềm gửi thư.

Cơ sở dữ liệu

Dữ liệu lưu đúng nhưng kết nối giữa ứng dụng và cơ sở dữ liệu khai báo bảng mã khác (ví dụ latin1) — chữ ghi vào và đọc ra bị biến đổi. Đây là lỗi kinh điển của các trang web tự dựng: hiển thị trên trang thì đúng, nhưng mở bằng công cụ quản trị lại thấy "Việt", hoặc ngược lại.

Phụ đề phim

Tệp phụ đề .srt lưu bằng bảng mã cũ hoặc UTF-8 không BOM, trình phát đoán sai. Đa số trình phát có tuỳ chọn chọn bảng mã phụ đề; chọn UTF-8 hoặc Windows-1258 tuỳ nguồn.

Ba ký tự lạ "" ở đầu trang

Một biến thể hay gặp: đầu tệp hoặc đầu trang web có ba ký tự "". Đó là BOM (byte order mark) của UTF-8 — ba byte EF BB BF mà một số trình soạn thảo chèn vào đầu tệp để đánh dấu "đây là UTF-8" — bị đọc theo Windows-1252. BOM có ích với Excel (nhờ nó Excel nhận ra CSV là UTF-8), nhưng lại gây hại với một số phần mềm khác, ví dụ trang web viết bằng PHP có thể hiện ba ký tự này ở đầu trang hoặc báo lỗi. Người làm web thường lưu mã nguồn ở dạng "UTF-8 không BOM".

Sửa thế nào cho đúng thứ tự

  1. Dừng lại, đừng lưu. Lưu khi đang hiển thị sai có thể biến lỗi "đọc nhầm" thành lỗi "ghi hỏng" — chữ sai bị ghi vào tệp như thật.
  2. Sao một bản dự phòng của tệp gốc trước khi thử bất cứ cách sửa nào.
  3. Mở lại với UTF-8. Trong trình soạn thảo văn bản (Notepad trên Windows 10/11, các trình soạn thảo lập trình), dùng chức năng mở lại với bảng mã chỉ định, chọn UTF-8.
  4. Nếu đã bị lưu đè ở dạng "Việt", vẫn có thể cứu bằng cách làm ngược: mã hoá chuỗi sai theo Windows-1252 để lấy lại byte gốc, rồi giải mã theo UTF-8. Người biết lập trình có thể làm bằng một dòng Python: chuoi.encode('cp1252').decode('utf-8').
  5. Nếu đã thành dấu hỏi "Vi?t", thông tin đã mất. Chỉ còn cách tìm bản gốc khác.

Phòng lỗi: năm thói quen

  • Luôn chọn UTF-8 khi phần mềm hỏi lưu bằng bảng mã nào.
  • Gửi dữ liệu bảng cho người dùng Excel: xuất "CSV UTF-8" hoặc gửi thẳng tệp .xlsx.
  • Không mở rồi lưu lại một tệp đang hiển thị sai.
  • Người làm web: khai UTF-8 ở mọi tầng — tệp mã nguồn, thẻ meta, máy chủ, kết nối cơ sở dữ liệu (với MySQL dùng utf8mb4).
  • Khi nhận tệp lạ, mở thử bằng trình soạn thảo văn bản thuần trước khi mở bằng phần mềm văn phòng.

Góc nhìn hôm nay

Từ ngày UTF-8 thành mặc định trên web và hệ điều hành, lỗi chữ Việt đã ít hẳn so với thời bảng mã 8 bit. Nhưng "Việt" vẫn xuất hiện mỗi khi một phần mềm cũ, một tệp CSV, một cấu hình máy chủ còn sót lại thói quen đoán bảng mã. Hiểu rằng đây chỉ là "đọc nhầm" chứ chưa "mất chữ" giúp bạn bình tĩnh: dừng lại, sao lưu, mở lại đúng bảng mã. Muốn tìm hiểu kỹ hơn, tài liệu của Unicode Consortium và trang hướng dẫn về bảng mã ký tự của W3C (w3.org/International) giải thích rõ cho người làm web.

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

Vì sao chữ Việt bị lỗi thành "Việt"?

Văn bản được lưu bằng UTF-8 nhưng phần mềm đọc bằng bảng mã Windows-1252 hoặc Latin-1. Mỗi chữ có dấu chiếm 2–3 byte và bị hiểu thành 2–3 ký tự châu Âu riêng lẻ.

Mở file CSV bằng Excel bị lỗi font tiếng Việt phải làm sao?

Không nhấp đúp mở tệp. Dùng chức năng nhập dữ liệu từ tệp văn bản/CSV trong thẻ Data của Excel và chọn bảng mã UTF-8. Khi tự xuất tệp, chọn kiểu lưu CSV UTF-8.

Chữ bị lỗi kiểu "Việt" có khôi phục được không?

Thường là được, vì byte gốc vẫn còn. Mở lại tệp với bảng mã UTF-8; nếu chuỗi sai đã bị lưu đè, có thể đảo ngược bằng cách mã hoá theo Windows-1252 rồi giải mã theo UTF-8.

Chữ thành dấu hỏi kiểu "Vi?t" thì sao?

Dấu hỏi nghĩa là chữ có dấu đã bị thay thế khi chuyển sang một bảng mã không chứa chữ Việt. Thông tin đã mất, chỉ có thể lấy lại từ bản gốc khác.

Ký tự � là gì?

Đó là ký tự thay thế (U+FFFD), xuất hiện khi phần mềm đọc theo UTF-8 nhưng gặp chuỗi byte không hợp lệ. Thường do tệp dùng bảng mã cũ nhưng bị mở như UTF-8.

Mở app Lưu Loát

Gõ tiếng Việt nhanh, chuẩn, lưu loát từng dấu

Mở app Lưu Loát

Bài viết liên quan

Mở app Lưu Loát

Gõ tiếng Việt nhanh, chuẩn, lưu loát từng dấu

Mở app Lưu Loát Xem app khác