Định dạng tệp
Tệp TXT là gì? Văn bản thuần, bảng mã và UTF-8
TXT là định dạng tài liệu đơn giản nhất: chỉ có ký tự và dấu xuống dòng. Vậy mà bảng mã, BOM và ký tự kết thúc dòng lại khiến nó trở thành một trong những định dạng gây rắc rối nhất. Bài viết giải thích từng yếu tố.
Tác giả: Hemen Dönüştür Editör EkibiNgày đăng: 10 phút đọc

TXT là định dạng tài liệu đơn sơ nhất của máy tính: không chữ đậm, không phông chữ, không dàn trang, chỉ có ký tự và dấu xuống dòng. Chính sự đơn giản đó khiến nó cực kỳ dễ mang đi mọi nơi. Một tệp văn bản viết từ năm mươi năm trước hôm nay vẫn mở được, và những gì bạn viết hôm nay rất có thể vẫn mở được sau nhiều thập kỷ nữa. Nhưng "văn bản thuần" không đơn giản như vẻ ngoài. Chữ có dấu biến thành "é" hay "?", các dòng dồn lại thành một, một ký tự vô hình ở đầu tệp: tất cả đều xuất phát từ một chi tiết ẩn bên trong tệp TXT, đó là bảng mã ký tự. Bài viết này giải thích cách tệp TXT hoạt động và cách khắc phục những lỗi này.
Tệp TXT là gì?
Một tệp có phần mở rộng .txt không chứa gì ngoài các ký tự văn bản. Không có phần đầu, không có siêu dữ liệu và không có định dạng; mọi byte đều thuộc về chính văn bản. Câu hỏi then chốt là: byte nào ứng với ký tự nào? Quy tắc ánh xạ đó gọi là bảng mã ký tự (character encoding), và một tệp TXT thường không ghi rõ nó dùng bảng mã nào. Chương trình mở tệp phải tự đoán.
Sơ lược lịch sử: từ ASCII đến UTF-8
ASCII được công bố lần đầu năm 1963 với tên ASA X3.4-1963. Nó dùng 7 bit và định nghĩa 128 ký tự: bảng chữ cái tiếng Anh, chữ số, dấu câu và các ký tự điều khiển như ký tự xuống dòng. Những chữ như é, ñ, ö hay các chữ có dấu của tiếng Việt đều không nằm trong ASCII.
Để lấp khoảng trống này, các bảng mã (code page) ra đời, gán 128 giá trị còn lại của một byte 8 bit cho các ngôn ngữ khác nhau: Windows-1252 và ISO-8859-1 cho các ngôn ngữ Tây Âu, Windows-1254 và ISO-8859-9 cho tiếng Thổ Nhĩ Kỳ, Windows-1258 cho tiếng Việt, cùng nhiều bảng mã khác. Vấn đề là cùng một byte lại mang nghĩa khác nhau trong các bảng mã khác nhau. Chẳng hạn, byte FD là "ý" trong Windows-1252 nhưng là "ı" trong Windows-1254. Chương trình đoán sai bảng mã sẽ hiển thị văn bản sai.
Giải pháp lâu dài là Unicode, gán cho mỗi ký tự của mọi hệ chữ viết một con số duy nhất. UTF-8 là cách phổ biến nhất để biến các con số đó thành byte. Theo lời kể của Rob Pike, Ken Thompson đã thiết kế UTF-8 trên một tấm lót bàn trong một quán ăn ở New Jersey vào một buổi tối khoảng tháng 9 năm 1992. Định nghĩa hiện hành của nó là RFC 3629 từ tháng 11 năm 2003: UTF-8 mã hóa mọi ký tự từ U+0000 đến U+10FFFF bằng 1 đến 4 byte, và ghi các ký tự ASCII bằng đúng một byte giống hệt ASCII.
Web cho thấy UTF-8 áp đảo đến mức nào: theo dữ liệu W3Techs ngày 15 tháng 10 năm 2026, 99,1% trang web xác định được bảng mã ký tự dùng UTF-8, tiếp theo là ISO-8859-1 với 0,8% và Windows-1252 với 0,2%.
Bên trong một tệp TXT có gì?
Ký tự và byte
Lưu chữ "café" dưới dạng UTF-8 và dưới dạng Windows-1252, bạn sẽ được các byte khác nhau:
Văn bản: c a f é
UTF-8: 63 61 66 C3 A9 (5 byte)
Windows-1252: 63 61 66 E9 (4 byte)
Chương trình đọc tệp UTF-8 như thể Windows-1252 sẽ hiển thị C3 và A9 thành hai ký tự riêng biệt, "é". Ngược lại, chương trình đọc tệp Windows-1252 như thể UTF-8 sẽ coi E9 là không hợp lệ và hiển thị "�" thay vào đó. Gần như mọi lỗi ký tự bị hỏng đều thuộc một trong hai trường hợp này.
BOM (dấu thứ tự byte)
Một số chương trình đặt các byte EF BB BF ở đầu tệp UTF-8. Đây là dạng UTF-8 của ký tự U+FEFF, được dùng như một chữ ký với ý nghĩa "tệp này là UTF-8". RFC 3629 lưu ý rằng chữ ký này luôn xuất hiện dưới dạng ba byte đó. Theo phần Hỏi đáp của Unicode, BOM không bắt buộc trong UTF-8 và chỉ đóng vai trò chữ ký, và nên tránh dùng nó trong các giao thức mong đợi ký tự ASCII ở đầu tệp. Trên thực tế, BOM giúp một số chương trình Windows đời cũ và Excel nhận ra UTF-8, nhưng có thể làm hỏng script shell trên Unix và các tệp cấu hình do một số phần mềm đọc.
Trong UTF-16, BOM còn quan trọng hơn vì nó cho trình đọc biết thứ tự byte: FF FE nghĩa là UTF-16 little-endian và FE FF nghĩa là big-endian.
Ký tự kết thúc dòng
Ký tự đánh dấu cuối dòng cũng phụ thuộc vào hệ điều hành:
| Hệ thống | Kết thúc dòng | Byte |
|---|---|---|
| Windows | CRLF | 0D 0A |
| Linux, macOS | LF | 0A |
| Mac OS cổ điển (trước OS X) | CR | 0D |
Trong nhiều năm, Notepad trên Windows chỉ hiểu CRLF, nên một tệp viết trên Linux hiện ra thành một dòng dài duy nhất. Microsoft công bố hỗ trợ LF và CR cho Notepad vào ngày 8 tháng 5 năm 2018, và thay đổi này đến với người dùng qua Windows 10 phiên bản 1809.
TXT được dùng ở đâu?
- Ghi chú và bản nháp: những ghi chép nhanh không cần định dạng.
- Phần mềm: tệp README, văn bản giấy phép, mã nguồn, tệp cấu hình và nhật ký (log).
- Trao đổi dữ liệu: danh sách đơn giản và dữ liệu xuất ra được chuyển giữa các hệ thống.
- Lưu trữ lâu dài: văn bản cần lưu trữ mà không phụ thuộc vào ứng dụng nào.
- Khả năng tiếp cận và xử lý: đầu vào sạch nhất cho trình đọc màn hình, công cụ tìm kiếm và công cụ phân tích văn bản.
Ưu điểm và nhược điểm
Ưu điểm: mọi thiết bị và hệ điều hành đều mở được. Tệp rất nhỏ. Không phụ thuộc vào phiên bản chương trình và rất ít nguy cơ hỏng. Các hệ thống quản lý phiên bản như Git hiển thị được thay đổi theo từng dòng. Không chứa được macro hay đối tượng nhúng nên an toàn.
Nhược điểm: không chứa được định dạng, hình ảnh, bảng hay liên kết. Vì bảng mã không được ghi trong tệp, nó có thể bị đoán sai. Khác biệt về ký tự kết thúc dòng gây ra những phiền toái nhỏ giữa các hệ thống. Nếu cần cấu trúc như tiêu đề và danh sách, Markdown là lựa chọn tốt hơn.
Những chương trình nào mở được TXT?
Notepad trên Windows, TextEdit trên macOS, gedit và các trình soạn thảo tương tự trên Linux đều mở được TXT, và trình duyệt có thể hiển thị tệp văn bản trực tiếp. Các trình soạn thảo nâng cao như Visual Studio Code, Notepad++ và Sublime Text hiển thị bảng mã và kiểu kết thúc dòng trên thanh trạng thái, cho phép đổi cả hai chỉ bằng một cú nhấp, nên đây là những công cụ tiện nhất để chẩn đoán lỗi bảng mã.
Các lỗi thường gặp và cách khắc phục
Chữ có dấu hiện thành "é" hoặc "ü"
Tệp được lưu dưới dạng UTF-8 nhưng chương trình đọc lại mặc định là Windows-1252. Hãy mở lại tệp dưới dạng UTF-8 bằng trình soạn thảo cho phép chọn bảng mã. Nếu một tệp CSV hoặc tệp văn bản hiện như vậy trong Excel, lưu lại dưới dạng UTF-8 có BOM thường sẽ khắc phục được.
Ký tự bị thay bằng "?" hoặc "�"
Tệp được lưu bằng một bảng mã cũ nhưng lại được đọc như UTF-8. Hãy mở tệp trong trình soạn thảo với đúng bảng mã đã chọn, rồi lưu lại dưới dạng UTF-8. Nếu văn bản đã được lưu với chính các ký tự "?", ký tự gốc đã mất và bạn cần quay lại tệp nguồn.
Toàn bộ văn bản nằm trên một dòng
Một trình soạn thảo cũ không hiểu ký tự kết thúc dòng LF. Hãy dùng Notepad bản mới hoặc một trình soạn thảo nâng cao, hoặc chuyển ký tự kết thúc dòng sang CRLF.
Có một ký tự vô hình ở đầu tệp
Đó thường là BOM. Nếu một script hoặc tệp cấu hình báo lỗi ở dòng đầu tiên, hãy lưu nó dưới dạng "UTF-8 không có BOM".
Mẹo khi chuyển đổi tệp TXT
Trên trình chuyển đổi của chúng tôi, tệp TXT được tải lên máy chủ và bị xóa trong vòng 30 phút. Bảng mã được nhận diện tự động: trước tiên BOM được kiểm tra (UTF-8, UTF-16 little-endian và big-endian); nếu không có BOM, tệp được kiểm tra xem có phải UTF-8 hợp lệ hay không; nếu không phải UTF-8 hợp lệ, tệp sẽ được đọc theo Windows-1254, bảng mã Windows cũ dành cho tiếng Thổ Nhĩ Kỳ. Vì vậy, nếu bạn có tệp tiếng Việt cũ lưu bằng một bảng mã như Windows-1258, hãy lưu lại dưới dạng UTF-8 trước khi chuyển đổi. Tệp chứa nhiều byte NUL được coi là tệp nhị phân chứ không phải văn bản, và bạn sẽ nhận thông báo "đây không phải tệp văn bản".
- Với TXT sang Word và TXT sang PDF, mỗi dòng trở thành một đoạn văn và các dòng trống được giữ lại. Phần thụt đầu dòng (mã nguồn, thơ hay các điều khoản đánh số) được chuyển thành khoảng trắng không ngắt để không bị mất, và các tab ở đầu dòng trở thành bốn khoảng trắng.
- TXT sang Markdown là điểm khởi đầu tốt khi bạn muốn bổ sung tiêu đề và danh sách cho văn bản thuần sau này.
- Theo chiều ngược lại, PDF sang TXT và Word sang TXT bỏ định dạng và ngăn cách tiêu đề với đoạn văn bằng dòng trống. Các tệp TXT chúng tôi tạo ra được lưu dưới dạng UTF-8 có BOM để chữ có dấu hiển thị đúng trong các chương trình như Notepad và Excel.
Câu hỏi thường gặp
Nên lưu tệp TXT bằng bảng mã nào?
UTF-8 cho tệp mới. Nó hỗ trợ mọi ngôn ngữ và gần như đã trở thành chuẩn chung trên web. Bỏ BOM nếu tệp sẽ được đọc bởi phần mềm mong đợi UTF-8 không có BOM; thêm BOM nếu tệp sẽ được mở trong các chương trình như Excel.
UTF-8 và UTF-8 có BOM khác nhau thế nào?
Nội dung giống hệt nhau; bản có BOM chỉ bắt đầu bằng các byte EF BB BF. Chữ ký đó giúp một số chương trình nhận ra bảng mã, nhưng có thể hiện thành một ký tự vô hình ở đầu tệp trong các chương trình khác.
TXT và RTF khác nhau thế nào?
TXT chỉ chứa ký tự. RTF mang định dạng như chữ đậm, nghiêng, phông chữ và bảng thông qua các lệnh điều khiển chèn trong văn bản. Nếu không cần định dạng, TXT đơn giản và dễ mang đi hơn.
Làm sao biết bảng mã của một tệp TXT?
Các trình soạn thảo như Visual Studio Code và Notepad++ hiển thị bảng mã trên thanh trạng thái. Các phiên bản Notepad hiện tại cũng hiển thị bảng mã và kiểu kết thúc dòng trên thanh trạng thái.
Tệp TXT có thể chứa virus không?
Bản thân một tệp văn bản thuần không chứa mã thực thi. Hãy cảnh giác với phần mở rộng kép như "tailieu.txt.exe"; bật hiển thị phần mở rộng tệp trong Windows giúp bạn phát hiện thủ thuật này.
Nguồn tham khảo
- IETF RFC 3629: UTF-8, a transformation format of ISO 10646 (tháng 11/2003)
- Unicode Consortium: UTF-8, UTF-16, UTF-32 and BOM FAQ
- Rob Pike: UTF-8 history
- W3Techs: Usage statistics of character encodings for websites
- Microsoft: Introducing extended line endings support in Notepad (8/5/2018)
- Wikipedia: ASCII (nguồn thứ cấp)


