Tại sao file CSV bị lỗi font trong Excel? Bảng mã UTF-8 BOM, dấu phân cách và số 0 đầu
Mục lục nội dung
1. Ba vấn đề kinh điển khi mở tệp CSV bằng Microsoft Excel
Định dạng CSV (Comma-Separated Values) được quy định trong chuẩn RFC 4180 là tệp văn bản thuần túy đơn giản nhất để trao đổi dữ liệu bảng. Tuy nhiên, khi người dùng nhấp đúp để mở tệp CSV trực tiếp trong Microsoft Excel, họ thường đối mặt với ba sự cố gây ức chế:
- Lỗi font ký tự tiếng Việt (Mojibake): Các ký tự có dấu như “Tiếng Việt” hoặc “Nguyễn Văn A” bị biến thành các ký tự rác như
Tiếng Việt. - Dồn toàn bộ dữ liệu vào một cột duy nhất: Các trường dữ liệu không tự chia tách thành các cột A, B, C mà dính liền nhau thành một dòng dài.
- Mất số 0 ở đầu (Leading Zeros): Số điện thoại
0901234567hoặc mã sản phẩm00124tự động bị Excel chuyển thành số học901234567và124.
2. Bí mật của dấu Byte Order Mark (UTF-8 BOM: 0xEF, 0xBB, 0xBF)
Mặc dù chuẩn Unicode khuyến nghị tệp UTF-8 không cần ký hiệu BOM (Byte Order Mark), Microsoft Excel trên hệ điều hành Windows lại áp dụng một cơ chế nhận diện lịch sử: nếu một tệp văn bản .csv không chứa 3 byte đầu tiên là 0xEF, 0xBB, 0xBF, Excel sẽ tự động giả định tệp được mã hóa bằng trang mã ANSI mặc định của hệ thống (chẳng hạn như Windows-1252 cho tiếng Anh hoặc Windows-1258 cho tiếng Việt).
Do bảng mã ANSI một byte không thể giải mã các chuỗi byte đa byte của UTF-8, toàn bộ ký tự có dấu sẽ bị vỡ vụn. Giải pháp kỹ thuật triệt để là luôn ghi thêm chuỗi 3 byte UTF-8 BOM vào đầu luồng dữ liệu trước khi lưu tệp.
3. Xung đột dấu phân cách: Dấu phẩy (,) vs Dấu chấm phẩy (;)
Tại các quốc gia nói tiếng Anh (Hoa Kỳ, Vương quốc Anh), dấu chấm (.) được dùng làm dấu phân cách thập phân và dấu phẩy (,) dùng làm dấu phân cách cột trong CSV. Ngược lại, tại Việt Nam và nhiều nước Châu Âu, dấu phẩy (,) được quy chuẩn làm dấu phân cách thập phân (ví dụ: $12,5$ kg).
Vì lý do này, Excel cài đặt theo vùng Việt Nam hoặc Châu Âu mặc định sử dụng dấu chấm phẩy (;) làm ký tự phân tách danh sách (List Separator). Khi mở một tệp CSV tiêu chuẩn dùng dấu phẩy, Excel sẽ coi toàn bộ dòng là một chuỗi văn bản duy nhất. Công cụ của GoToolstack cho phép bạn dễ dàng chuyển đổi qua lại giữa định dạng dấu phẩy và dấu chấm phẩy phù hợp với cấu hình máy tính của bạn.
4. Cách bảo toàn số 0 ở đầu và mã định danh
Để ngăn chặn Excel tự động ép kiểu dữ liệu từ chuỗi thành số học, bạn có thể áp dụng cú pháp công thức chuỗi tĩnh trong CSV:
Mã nhân viên,Họ và tên,Số điện thoại
="00142",Nguyễn Văn A,="0901234567"
="00143",Trần Thị B,="0987654321"Dấu ="giá trị" buộc Excel hiểu đây là một công thức trả về chuỗi văn bản, giữ nguyên vẹn 100% các chữ số 0 ở đầu.