Tài liệu tiếng Việt bị lỗi phông, đọc được bằng một dòng.
viparse chuyển file dùng bảng mã cũ — TCVN3, VNI, VISCII, VPS — sang Unicode dựng sẵn (NFC), giữ nguyên bảng biểu và cấu trúc. Đọc được .doc, .xls, .ppt đời cũ, RTF, PDF và cả PDF scan.
File không hỏng. Máy bạn thiếu phông.
Trước khi Unicode phổ biến ở Việt Nam, chữ có dấu được lưu bằng các byte Latin thông thường và chỉ hiện đúng khi máy có đúng bộ phông đó. Không có .VnTime, bạn thấy đúng những byte đang nằm trong file — nên mọi thư viện đọc tài liệu thông thường đều đọc đúng mà vẫn sai.
B¸o c¸o tµi chÝnh quý II n¨m 2026 cña c«ng ty. ThÞ trêng ViÖt Nam ph¸t triÓn m¹nh.
Báo cáo tài chính quý II năm 2026 của công ty. Thị trường Việt Nam phát triển mạnh.
Về bản chất đây là việc mà chức năng Công cụ → Chuyển mã của Unikey vẫn làm — nhưng chạy được trên cả file, giữ nguyên bảng biểu, và gọi được từ trong code.
Ba bước.
Những gì có sẵn.
Hai dòng là ra chữ sạch.
import viparse
viparse.fix("B¸o c¸o tµi chÝnh") # 'Báo cáo tài chính'
docs = viparse.load("bao_cao_2003.doc") # list[Document], đã NFCfix() nhận chuỗi chứ không nhận đường dẫn, nên ghép được với bất cứ thứ gì đã đọc file trước đó. Chữ đã là Unicode, và chữ không phải tiếng Việt, được trả lại nguyên vẹn.
Dán chữ lỗi vào, lấy Unicode ra.
Chạy ngay trong trình duyệt — không gửi gì lên server, và vẫn chạy được khi mất mạng sau lần tải đầu.
Đo trên file hỏng thật.
96 văn bản nhà nước Việt Nam từ 2002–2009 — Word, Excel, RTF, PDF và PowerPoint — được chép tay lại rồi chấm điểm trên độ chính xác dấu thanh. Corpus, cách đo, kết quả thô và câu lệnh tạo lại chúng đều công khai.
| Cách đọc | Ký tự | Dấu thanh | Âm tiết |
|---|---|---|---|
| No conversionđọc byte trung thực, không chuyển mã | 0.787 | 0.019 | 0.225 |
| viparse 0.1.2796 tài liệu, từ file đến kết quả | 0.982 | 0.986 | 0.985 |
Hàng 0.019 mới là con số đáng nói: văn bản trông còn nguyên 79% nhưng chỉ mang 1,9% lượng tiếng Việt. Hàng của viparse yếu hơn vẻ ngoài của nó — bản chép tay và bảng chuyển mã cùng rút ra từ một corpus, nên nó đo tính nhất quán với chính mình cũng nhiều như đo tính đúng. Cả hai con số, cách đo, từng tài liệu và câu lệnh tạo lại đều được công bố để có thể tranh luận lại.
Và với tài liệu Unicode bình thường
| Tài liệu | Thứ tự | Đầy đủ | Tiêu đề |
|---|---|---|---|
| DOCX · XLSX · PPTX | 1.000 | 1.000 | 1.000 |
| PDF một cột | 1.000 | 1.000 | 0.000 |
| PDF hai cột | 0.600 | 1.000 | 0.000 |
Không bao giờ mất chữ — cột đầy đủ bằng 1.000 ở mọi nơi. Cả hai chỗ hỏng đều là hỏng về sắp xếp, loại khó phát hiện hơn hẳn. PDF không có tiêu đề, nên mọi chunk từ PDF đều có section rỗng; và PDF nhiều cột bị đọc ngang trang chứ không đọc dọc theo cột. Lấy lại đúng cột nghĩa là phải phân tích bố cục, việc mà viparse cố ý không làm: với những file đó hãy dùng bộ đọc hiểu bố cục rồi đưa kết quả qua viparse.fix().