Sửa lỗi font tiếng Việt trong Python và pandas

pandas đọc ra á thay cho á, dừng với UnicodeDecodeError, hoặc Excel mở file CSV bạn xuất bị lỗi chữ? Trong Python, tham số encoding quyết định đúng hay sai. Dưới đây là các trường hợp điển hình – file hỏng thì sửa ngay trong trình duyệt ở trên.

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)

UnicodeDecodeError khi đọc file

pd.read_csv mong đợi UTF-8. Nếu file lưu theo Windows-1258 (ANSI tiếng Việt) hay Windows-1252, pandas sẽ dừng với UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 – 0xE0 là à trong các bảng mã đó. Khi ấy hãy chỉ rõ bảng mã:

  • pd.read_csv('data.csv', encoding='cp1258') cho file tiếng Việt từ Excel và Windows.
  • encoding='latin-1' không bao giờ báo lỗi nhưng đọc sai nhiều chữ Việt – thường không nên dùng.
  • Nếu không biết bảng mã, hãy thả file vào Mojibuster: nó tự nhận diện và lưu file thành UTF-8.

á thay cho á trong DataFrame

Nếu DataFrame hiện á hoặc Tiếng, file UTF-8 đã bị đọc theo latin-1 hay cp1252 – hoặc dữ liệu đã hỏng từ trước. Với trường hợp đầu, encoding='utf-8' là đủ. Nếu bản thân dữ liệu hỏng thì value.encode('cp1252').decode('utf-8') giúp được với từng giá trị. Nhưng với dữ liệu trộn lẫn, nó lỗi ngay khi gặp ô vốn đã đúng. Dễ hơn: sửa file bằng Mojibuster rồi hãy đọc.

CSV xuất từ pandas, mở trong Excel không có BOM

Trước

tªn,thµnh phè,doanh thu
NguyÔn V¨n Hïng,§µ N½ng,1250
TrÇn ThÞ Mai,H¶i Phßng,980

Sau

tên,thành phố,doanh thu
Nguyễn Văn Hùng,Đà Nẵng,1250
Trần Thị Mai,Hải Phòng,980

to_csv: Excel hiển thị file sai

df.to_csv('export.csv') ghi UTF-8 không BOM. Excel mở file như vậy theo ANSI, và chữ có dấu thành ký tự lạ. Với encoding='utf-8-sig', pandas ghi thêm BOM và Excel nhận ra UTF-8. Xem thêm lỗi font Excel và CSV.

open() trên Windows

open('file.txt') không có encoding dùng bảng mã hệ thống trên Windows, thường là cp1252 hoặc cp1258. Script chạy tốt trên Linux sẽ đọc cùng file UTF-8 đó thành ký tự vỡ trên Windows. Vì vậy hãy luôn truyền encoding='utf-8' hoặc đặt biến môi trường PYTHONUTF8=1. Theo PEP 686, các phiên bản Python sau này cũng sẽ mặc định dùng UTF-8.

Dữ liệu web với requests

requests suy ra response.text từ tiêu đề Content-Type. Nếu phản hồi dạng văn bản không ghi bộ ký tự ở đó, nó giả định ISO-8859-1 và trang UTF-8 tiếng Việt hiện chữ vỡ. Hãy đặt response.encoding = 'utf-8' trước, hoặc dùng response.json() vì nó tự nhận ra UTF-8.

Nếu văn bản được ghi bằng errors='replace' vào bảng mã thiếu ký tự cần thiết thì file chứa ? – lúc đó thông tin đã mất, xem mojibake là gì. Còn văn bản gõ bằng font cũ như TCVN3 hay VNI thì xem sửa lỗi font tiếng Việt.

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

Có thư viện Python nào cho việc này không?

Có, ftfy sửa mojibake trong mã Python. Với từng file đơn lẻ mà không cần lập trình, Mojibuster nhanh hơn và cho bạn xem mọi thay đổi trước khi lưu.

Tôi hay cần những giá trị encoding nào?

utf-8, utf-8-sig (UTF-8 có BOM), cp1258 (Windows tiếng Việt), cp1252, latin-1 và utf-16. Chữ hoa, chữ thường và dấu gạch ngang không quan trọng.

Dấu phân cách và số có được giữ nguyên không?

Có. Mojibuster chỉ đổi những ký tự hỏng. Dấu phẩy, dấu ngoặc kép và ngắt dòng giữ nguyên hoàn toàn.

Hướng dẫn khác