Vì sao chữ tiếng Việt bị lỗi font và cách sửa

VNI, TCVN3, Unicode và UTF-8 giải thích bằng ví dụ thật về chữ lỗi, cách nhận ra văn bản đang ở bảng mã nào và cách khôi phục lại chữ.

Trong bài này

Ai từng mở một tệp Word cũ của trường học hay cơ quan đều đã gặp: "Vieät Nam", "ViÖt Nam" hay "Việt Nam" ở chỗ lẽ ra là "Việt Nam". Chữ không hề mất. Nó được lưu đúng theo một bảng mã nhưng lại bị đọc theo bảng mã khác, và mỗi kiểu chữ lỗi có một "dấu vân tay" cho biết lỗi xảy ra theo cách nào. Bài này giải thích các bảng mã tiếng Việt đã trải qua, cho thấy mỗi loại trông thế nào khi hỏng, và cách lấy lại chữ. Mọi phép chuyển dưới đây được tạo bằng công cụ văn bản tiếng Việt.

Vì sao tiếng Việt khó với máy tính

Bảng chữ cái tiếng Việt có 29 chữ, trong đó 12 nguyên âm, cùng năm dấu thanh có thể đặt trên mọi nguyên âm. Đếm mọi tổ hợp nguyên âm, dấu phụ và dấu thanh, có 67 chữ thường mang dấu cùng các chữ hoa tương ứng: 134 kí tự ngoài A–Z thông thường. Một chữ như "ệ" mang cùng lúc hai dấu, dấu mũ và dấu nặng.

Thế giới máy tính thời đầu xây quanh ASCII với 128 mã, và các bản mở rộng 8 bit với 256 mã. Các ngôn ngữ Tây Âu nhét vừa vài chữ có dấu vào 128 mã phía trên. Tiếng Việt thì không: 134 chữ thêm vào đã nhiều hơn 128 mã còn trống, chưa kể dấu câu. Mọi giải pháp trước Unicode đều là thoả hiệp.

Ba lời giải cũ

VNI (font như VNI-Times) lưu phần lớn chữ bằng hai byte: chữ gốc rồi một byte cho dấu. "ệ" là "e" theo sau là một byte mà font vẽ thành mũ cộng dấu nặng. Vài chữ chỉ có một byte: "ơ", "ư", "đ" và các chữ i.

TCVN3, còn gọi là ABC (font như .VnTime, .VnArial), là tiêu chuẩn quốc gia TCVN 5712:1993. Mỗi chữ thường có một byte, nhưng chỉ đủ chỗ cho bảy chữ hoa: Ă, Â, Ê, Ô, Ơ, Ư và Đ. Một chữ hoa có dấu thanh, như "Ệ" trong "VIỆT NAM", đơn giản là không có mã. Người đánh máy gõ tiêu đề bằng chữ thường rồi đổi sang font chữ hoa (.VnTimeH), font này vẽ các mã chữ thường thành chữ hoa.

VIQR (RFC 1456) né hẳn byte đặc biệt bằng cách viết dấu thành kí tự ASCII sau nguyên âm: "Vie^.t Nam", "ddu+o+`ng". Kiểu này được dùng trong email và diễn đàn những năm 1990, khi văn bản 8 bit hay bị hỏng.

Cả ba đều dùng được miễn là mọi người cài cùng font. Các byte trên đĩa chỉ là chữ Việt khi font nói vậy.

Mỗi loại chữ lỗi trông thế nào

Khi thiếu font tương ứng, Windows hiển thị các byte đó thành chữ Tây Âu (bảng mã Windows-1252). Mỗi bảng mã khi đó cho ra một kiểu dễ nhận:

Chữ đúngVNI hiển thị bằng font thườngTCVN3 hiển thị bằng font thường
Việt NamVieät NamViÖt Nam
Tiếng ViệtTieáng VieätTiÕng ViÖt
Hà NộiHaø NoäiHµ Néi
Đường đờiÑöôøng ñôøi§­êng ®êi

Dấu vân tay: VNI giữ nguyên nguyên âm gốc rồi theo sau là ä, á, ø, õ, ï; "đ" thành "ñ" và "ư" thành "ö". TCVN3 thay cả chữ bằng một kí tự lạ như Ö, Õ, µ, ® hay §. Chữ "ư" của TCVN3 là byte 0xAD, mà Windows-1252 định nghĩa là gạch nối mềm, một kí tự vô hình, nên "người" có thể hiện thành "ngêi" như thể mất chữ "ư". Thường thì nó vẫn còn, chỉ là không thấy; nhưng nếu văn bản đã đi qua một chương trình xoá gạch nối mềm thì nó mất hẳn.

Kiểu hiện đại thì khác. "Việt Nam" hoàn toàn không phải font cũ: đó là Unicode UTF-8 đúng nhưng bị đọc như Windows-1252. "ệ" chiếm ba byte trong UTF-8 (E1 BB 87), và mỗi byte hiện thành một chữ Tây Âu riêng: á, », ‡. Bạn sẽ gặp kiểu này ở tệp CSV mở bằng Excel, ở cơ sở dữ liệu cũ và ở email thiếu khai báo bảng mã.

Cách sửa từng trường hợp

  • Chữ lỗi VNI hoặc TCVN3: dán vào thẻ bảng mã của công cụ văn bản tiếng Việt và để nguồn ở chế độ tự nhận diện. Công cụ đếm các dấu vân tay ở trên để biết là bảng mã nào, chuyển sang Unicode và cho biết việc nhận diện là chắc chắn hay chỉ đoán. Một đoạn văn là đủ; một từ đơn lẻ có thể mơ hồ, nên hãy tự chọn bảng mã nếu kết quả chỉ đúng một nửa.
  • Tiêu đề TCVN3 viết hoa: đánh dấu ô font chữ hoa, vì bản thân văn bản chỉ chứa mã chữ thường.
  • UTF-8 bị đọc thành Windows-1252 ("Việt"): đừng chép chữ lỗi đi đâu cả, hãy sửa cách mở tệp. Trong Excel, dùng Data → From Text/CSV và chọn 65001: Unicode (UTF-8) làm nguồn tệp; trong trình soạn thảo, mở lại với UTF-8. Khi xuất CSV cho Excel, hãy lưu dạng UTF-8 có BOM.
  • Cả một tệp .doc cũ dùng VNI hay TCVN3: một bộ chuyển mã trên máy như công cụ có sẵn trong UniKey (làm việc với bộ nhớ tạm và nội dung RTF, giữ định dạng) nhanh hơn dán từng trang; trang này dành cho văn bản dán vào.

Cùng chữ, khác byte: NFC và NFD

Ngay trong Unicode cũng có hai cách lưu "ệ". NFC dùng một điểm mã (U+1EC7). NFD dùng "e" theo sau là hai dấu kết hợp, dấu mũ và dấu nặng. "Việt" có 4 điểm mã ở NFC và 6 ở NFD. Trên màn hình trông giống hệt nhau, nhưng tìm cái này không ra cái kia, và cơ sở dữ liệu có thể coi đó là hai tên khác nhau. Tên tệp trên macOS và chữ trong một số PDF thường là NFD. Công cụ nhận cả hai, luôn trả về NFC và cho biết khi nó phải ghép các chữ tổ hợp.

Những lỗi hay gặp

  • Gõ lại thay vì chuyển mã. Bộ chuyển mã sửa 20 trang trong một giây, không sai chính tả.
  • Chuyển mã hai lần. Chạy chuyển từ bảng mã cũ sang Unicode trên văn bản vốn đã là Unicode có thể làm hỏng chữ đúng. Hãy nhìn văn bản trước; nếu đã đọc đúng thì để yên.
  • Đoán từ một từ. "Noäi" có thể là VNI; "Néi" có thể là TCVN3 hoặc một lỗi gõ tiếng Pháp. Hãy dùng đoạn dài hơn.
  • Lưu văn bản mới bằng bảng mã cũ. Chỉ làm khi hệ thống bắt buộc, như một mẫu cũ. Mọi thứ khác nên dùng Unicode (UTF-8).
  • Trộn kiểu đặt dấu. "hòa" và "hoà" đều đúng nhưng là hai chuỗi khác nhau. Văn bản chuyển mã giữ nguyên kiểu người gõ ban đầu dùng; hãy thống nhất lại nếu cần tìm kiếm cho chính xác.

Bỏ dấu và tạo slug

Đôi khi bạn cố ý muốn bỏ dấu: cho URL, tên tệp hay một hệ thống chỉ nhận ASCII. Bỏ dấu không chỉ là xoá các dấu kết hợp, vì "đ" là một chữ riêng chứ không phải "d" cộng dấu: "Đường đời" phải thành "Duong doi". Slug cho URL đi xa hơn, chuyển thành chữ thường và nối các từ: "duong-doi-dau-phai-duong-thang". Cả hai chỉ cần một cú bấm trong công cụ văn bản tiếng Việt; muốn đếm từ hay xử lý ngôn ngữ khác, dùng bộ công cụ văn bản.

Công cụ được nhắc trong bài

Về trang blog