Chữ tiếng Việt thành dấu ? hoặc �: nguyên nhân và cách xử lý

Chữ có dấu trong văn bản biến thành ? hoặc ký tự �? Hai lỗi trông giống nhau nhưng nguyên nhân khác nhau. Nhiều khi file vẫn còn nguyên. Có khi chữ đã mất thật. Đây là cách phân biệt hai trường hợp.

Hỗ trợ văn bản và các file sau:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Ví dụ file xuất từ Excel, bản sao cơ sở dữ liệu, phụ đề hoặc mã nguồn trang web.

Sửa lỗi

  1. Kéo file vào hoặc dán văn bản
  2. Tự động sửa
  3. Sao chép hoặc tải về
hoặc kéo file vào đây
  • Không tải lên. File được sửa ngay trong trình duyệt và không rời khỏi thiết bị của bạn.

  • Máy chủ tại EU. Mojibuster chạy trên máy chủ ở Phần Lan (EU), vì vậy Quy định chung về bảo vệ dữ liệu (GDPR) được áp dụng. Toàn văn GDPR (EUR-Lex, tiếng Anh)

Trường hợp 1: file vẫn tốt nhưng hiện �

Nếu trình soạn thảo, trình phát phim hay trình duyệt hiện � thay cho mọi chữ có dấu, file thường được lưu bằng một bảng mã cũ: Windows-1258 (hiếm gặp) hoặc bảng mã TCVN3, VNI từ phần mềm cũ. Chương trình lại đọc file như UTF-8. Các byte đó không hợp lệ trong UTF-8, nên chương trình chỉ chèn � khi hiển thị. Trong file, byte đúng vẫn còn nguyên.

Cách sửa: kéo file gốc vào ô phía trên. Mojibuster nhận ra bảng mã khi đọc và lưu lại thành UTF-8. Lưu ý: dùng chính file đó, đừng sao chép chữ từ chương trình ra. Khi sao chép, � sẽ bị lưu lại vĩnh viễn.

Nếu bạn thấy Hµ Néi hay Haø Noäi thay vì Hà Nội, đó không phải lỗi này. Văn bản được gõ bằng font TCVN3 hoặc VNI và cần chuyển mã: xem chuyển font TCVN3, VNI sang Unicode.

Trường hợp 2: ? hoặc � đã nằm trong văn bản

Nếu chương trình đã lưu hoặc gửi văn bản kèm �, chữ gốc đã mất. Với ? cũng vậy: chương trình chèn ? khi chữ không có trong bảng mã đích. Ví dụ Vi?t Nam sau khi lưu file thành ANSI, hoặc ???? trong cột cơ sở dữ liệu không hỗ trợ tiếng Việt.

Không thể tính ngược lại, vì mọi chữ có dấu đều thành cùng một ký tự. Mojibuster không đoán mò mà cho biết có bao nhiêu chỗ bị ảnh hưởng. Chỉ nguồn gốc mới giúp được: xuất dữ liệu lại hoặc lấy bản sao lưu.

Dấu hỏi thường đến từ đâu?

  • Cơ sở dữ liệu: cột hoặc kết nối dùng latin1 hay ascii, còn dữ liệu đến dưới dạng UTF-8. MySQL thay chữ không có trong bảng mã bằng ?, nên Nguyễn thành Nguy?n – xem MySQL và phpMyAdmin.
  • Website PHP cũ: trang không khai báo bảng mã trong header hay <meta charset>, nên trình duyệt hiện �. Nếu kết nối tới cơ sở dữ liệu mở mà không đặt utf8mb4, chữ có dấu được ghi vào thành ?.
  • Notepad, „Save As“ → ANSI: ANSI trên Windows tiếng Anh là bảng mã Tây Âu. Chữ như ệ, ạ, đ không có trong đó và bị lưu thành ?.
  • PowerShell 5.1: Export-Csv mặc định ghi ASCII và thay chữ có dấu bằng ? – xem PowerShell.
  • Python: encode('ascii', errors='replace') lặng lẽ thay chữ bằng ? – xem Python và pandas.
  • Cửa sổ dòng lệnh (CMD): bảng mã của console không có chữ tiếng Việt và hiện chúng thành ?. Thường chỉ phần hiển thị sai, file vẫn đúng.
  • Email cũ: thư gửi bằng bảng mã cũ hoặc qua máy chủ chỉ hỗ trợ ASCII có thể đến nơi với ? thay cho chữ có dấu.
  • Chuyển mã sai: khi chuyển giữa Unicode, TCVN3 và VNI bằng công cụ cũ, dấu thanh có thể bị rơi mất hoặc chữ thành ?. Dấu đã mất thì cũng không khôi phục tự động được.

Làm sao biết mình gặp trường hợp nào?

  1. Mở file trong trình soạn thảo có hiện bảng mã, ví dụ Notepad++. Nếu thanh trạng thái ghi „ANSI“ hay „Windows-1258“, đó là trường hợp 1.
  2. Kéo file vào Mojibuster. Nếu kết quả ghi đã đọc bằng một bảng mã cũ và chữ có dấu hiện lại, đó là trường hợp 1.
  3. Nếu Mojibuster báo có ký tự bị mất, đó là trường hợp 2. Khi đó chỉ còn cách xuất dữ liệu lại.

Nếu thay vì dấu hỏi bạn thấy chuỗi như Việt, đó là lỗi khác và gần như luôn sửa được: lỗi font chữ (mojibake) là gì.

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

Mojibuster có biến ? trở lại thành chữ được không?

Không. Một dấu ? có thể là bất kỳ chữ nào, thông tin đã mất. Mojibuster để nguyên những chỗ đó và cho biết có bao nhiêu chỗ.

Vì sao chương trình này hiện �, chương trình khác lại hiện đúng?

Nghĩa là file vẫn tốt, chỉ một chương trình đọc sai bảng mã. Hãy lưu file thành UTF-8 bằng Mojibuster, cả hai chương trình sẽ hiện đúng.

Ký tự � là gì?

Đó là ký tự thay thế U+FFFD. Chương trình chèn nó khi không đọc được một byte thành chữ. Nó báo hiệu lỗi bảng mã, không thuộc về nội dung văn bản.

Hướng dẫn khác