
Xử lý tiếng Việt đúng cách: UTF-8, BOM, tên file có dấu và các lỗi mã hóa hay gặp
#Python#Unicode#Tiếng Việt1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Lỗi chữ hiện thành 'á' hay dấu hỏi trên Excel, tên file có dấu bị lỗi trong NX là phiền toái quen thuộc. Phần lớn xuất phát từ việc không chỉ rõ mã hóa khi đọc/ghi file.
Xử lý tiếng Việt đúng cáchCác bước thực hiện
- Luôn chỉ rõ encoding. open(..., encoding="utf-8").
- Excel cần BOM. Dùng utf-8-sig khi ghi CSV.
- Chuẩn hóa chuỗi. unicodedata.normalize NFC trước khi so sánh.
- Bỏ dấu khi cần. Tạo tên file không dấu.
- Kiểm tra tên file. Tránh ký tự cấm của Windows.
Code tham khảo (Python)
import re import unicodedata def chuan_hoa(s): """NFC: gom dấu thành một ký tự, để 'ế' gõ hai cách đều cho cùng một chuỗi.""" return unicodedata.normalize("NFC", s) def bo_dau(s): s = unicodedata.normalize("NFD", s) s = "".join(c for c in s if unicodedata.category(c) != "Mn") return s.replace("đ", "d").replace("Đ", "D") def ten_file_an_toan(s, toi_da=80): s = bo_dau(chuan_hoa(s)) s = re.sub(r'[<>:"/\\|?*\x00-\x1f]', "_", s) # ký tự cấm trên Windows s = re.sub(r"\s+", "_", s).strip("._ ") return (s or "khong_ten")[:toi_da] def ghi_csv_cho_excel(duong_dan, dong): import csv with open(duong_dan, "w", newline="", encoding="utf-8-sig") as f: # BOM để Excel nhận UTF-8 csv.writer(f).writerows(dong) def so_sanh_khong_phan_biet(a, b): return bo_dau(chuan_hoa(a)).casefold() == bo_dau(chuan_hoa(b)).casefold() def main(): cac_ten = ["Bản vẽ: Trục chính (Ø20).prt", "Chi tiết số 1 / REV A", "ĐẾ MÁY"] for ten in cac_ten: print("%-34s -> %s" % (ten, ten_file_an_toan(ten))) print("So sánh 'Đế máy' và 'DE MAY':", so_sanh_khong_phan_biet("Đế máy", "DE MAY")) if __name__ == "__main__": main()Giải thích code
- NFC/NFD là hai cách biểu diễn cùng một ký tự có dấu; chuẩn hóa NFC trước khi so sánh để hai chuỗi trông giống nhau cũng bằng nhau.
utf-8-sigthêm BOM đầu file; Excel dựa vào BOM để nhận đúng UTF-8.casefold()mạnh hơnlower()khi so sánh không phân biệt hoa thường.
Lỗi thường gặp
- NX và một số định dạng xuất (DXF cũ, STEP) xử lý ký tự ngoài ASCII rất khác nhau; dùng tên không dấu cho dữ liệu trao đổi.
- Windows giới hạn 260 ký tự cho đường dẫn đầy đủ; cắt ngắn tên (tham số
toi_da).
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.