NhaLapTrinh.comNhà Lập Trình
Máy tính chạy thế nào

Chữ tiếng Việt bị lỗi font: bảng mã là gì?

Máy tính lưu mỗi chữ thành một con số theo một bảng mã. Chữ tiếng Việt bị lỗi khi chỗ ghi và chỗ đọc dùng hai bảng mã khác nhau, hoặc một chữ có dấu được lưu theo hai cách dựng sẵn và tổ hợp. Dùng một bảng mã chung từ đầu tới cuối là cách phòng.

🎙️
📑 Nội dung theo chương
  1. 0:35 Mỗi chữ là một con số
  2. 1:27 Dấu hỏi chấm và những ô vuông
  3. 2:24 Một chữ, hai cách lưu
  4. 3:20 Sắp xếp và tìm kiếm theo kiểu người Việt
  5. 4:15 Thói quen nhỏ để khỏi mất chữ
  6. 4:59 Câu hỏi thường gặp
🔊 Bản audio (lồng nhạc nền)

Chữ tiếng Việt bị lỗi vì máy tính lưu mỗi chữ thành một con số theo một bảng mã, và khi chỗ ghi với chỗ đọc hiểu hai bảng mã khác nhau, con số được dịch ra thành chữ khác. Còn một lỗi khó thấy hơn: cùng một chữ có dấu có thể được lưu theo hai cách, trông giống hệt nhau mà máy coi là khác.

Chào bạn, đây là Nhà Lập Trình. Người Việt nào dùng máy tính đủ lâu cũng từng mở một văn bản cũ và thấy toàn ký tự lạ. Với người lập trình, chuyện này không chỉ là phiền, nó là lỗi mất dữ liệu, lỗi tìm kiếm, lỗi sắp xếp tên khách hàng. Tập này mình kể bảng mã bằng lời thường.

Mỗi chữ là một con số

Máy tính chỉ hiểu con số. Để lưu chữ, người ta lập ra một bảng: chữ a ứng với số này, chữ b ứng với số kia. Bảng đó gọi là bảng mã. Khi bạn gõ chữ, máy lưu con số. Khi hiện lên, máy tra ngược bảng để vẽ ra chữ.

Bảng mã đầu tiên phổ biến rộng rãi chỉ có chỗ cho chữ cái Latinh không dấu, số và vài ký hiệu. Không có chỗ cho chữ ư, chữ ơ, càng không có chỗ cho chữ ặ hay ỡ. Thế là mỗi nước tự chế bảng mã riêng, và Việt Nam từng có mấy bảng mã cùng tồn tại.

Các bảng mã riêng đó dùng lại cùng những con số cho những chữ khác nhau. Một con số trong bảng này là chữ ạ, trong bảng kia lại là một ký hiệu lạ. Văn bản gõ theo bảng này mà mở bằng bảng kia thì thành rác. Đó là hiện tượng lỗi font mà thế hệ trước quen thuộc.

Về sau cả thế giới dần thống nhất một bảng mã chung đủ chỗ cho mọi chữ viết của loài người, gọi là Unicode. Nhưng thống nhất bảng mã chưa giải quyết hết mọi chuyện.

Dấu hỏi chấm và những ô vuông

Lỗi thường gặp nhất của lập trình viên hôm nay không còn là hai bảng mã Việt đánh nhau, mà là một khâu nào đó trên đường đi không hiểu bảng mã chung. Chữ đi từ trình duyệt, qua chương trình, vào cơ sở dữ liệu, rồi quay ra. Chỉ cần một khâu cấu hình sai là chữ có dấu biến thành dấu hỏi chấm.

Đáng sợ nhất là khi dấu hỏi chấm được ghi thẳng vào cơ sở dữ liệu. Lúc đó dữ liệu gốc đã mất, không có cách nào khôi phục. Tên một khách hàng có ba chữ có dấu sẽ mãi mãi là ba chữ lẫn dấu hỏi chấm.

Cũng có trường hợp chữ không mất mà bị hiểu sai hai lần, thành một chuỗi ký tự lạ dài ngoằng. Trường hợp này đôi khi còn cứu được bằng cách dịch ngược lại, nếu bạn đoán đúng nó đã bị hiểu sai theo kiểu nào.

Nguyên tắc phòng là dùng đúng một bảng mã chung từ đầu tới cuối: trang web khai báo rõ, kết nối cơ sở dữ liệu khai báo rõ, bảng dữ liệu khai báo rõ. Và kiểm thử bằng chính những chữ khó nhất của tiếng Việt, chứ đừng chỉ thử với chữ không dấu.

Một chữ, hai cách lưu

Giờ tới lỗi mà nhiều lập trình viên có kinh nghiệm vẫn chưa gặp, hoặc gặp mà không hiểu. Trong bảng mã chung, chữ ế có thể được lưu theo hai cách. Cách thứ nhất là một con số duy nhất cho cả chữ ế. Cách thứ hai là ba con số ghép lại: chữ e, dấu mũ, dấu sắc. Cách đầu gọi là dựng sẵn, cách sau gọi là tổ hợp.

Trên màn hình, hai cách trông giống hệt nhau. Nhưng với máy, đó là hai chuỗi khác nhau. Người dùng gõ tìm chữ Huế, trong cơ sở dữ liệu lại lưu chữ Huế theo cách kia, và kết quả tìm kiếm trả về không có gì. Người dùng chụp màn hình gửi bạn, chữ nhìn giống hệt, bạn không hiểu vì sao.

Chuyện này hay xảy ra khi dữ liệu đến từ nhiều nguồn: người gõ trên điện thoại, người dán từ một văn bản cũ, người dùng bộ gõ đặt chế độ khác. Mỗi nguồn có thể cho ra một cách lưu.

Cách xử lý là chuẩn hoá: trước khi lưu hay so sánh, đưa mọi chữ về cùng một cách. Hầu hết ngôn ngữ lập trình đều có sẵn công cụ làm việc này. Cái khó chỉ là biết rằng mình cần làm nó.

Sắp xếp và tìm kiếm theo kiểu người Việt

Có bảng mã đúng rồi, vẫn còn chuyện sắp xếp. Máy sắp theo con số của từng chữ, còn người Việt sắp theo bảng chữ cái tiếng Việt. Theo con số, chữ Đ có thể nằm tít cuối danh sách, sau cả chữ Y. Danh sách học sinh mà xếp em Đạt sau em Yến là giáo viên phàn nàn ngay.

Cơ sở dữ liệu thường có tuỳ chọn gọi là quy tắc so sánh, quyết định cách sắp xếp và so khớp chữ. Chọn đúng quy tắc giúp danh sách đúng thứ tự. Nhưng cũng cần cẩn thận: có quy tắc coi chữ có dấu và không dấu là như nhau, tiện cho tìm kiếm, nhưng lại khiến hai tên khác nhau bị coi là trùng.

Tìm kiếm tiếng Việt còn có một đòi hỏi riêng: người dùng hay gõ không dấu. Gõ ha noi phải ra Hà Nội. Muốn vậy, nhiều hệ thống lưu thêm một bản không dấu để tìm, còn bản có dấu để hiện.

Và đừng quên tên riêng người Việt: sắp theo tên chứ không theo họ, vì nửa lớp học có họ Nguyễn. Đây là chi tiết mà phần mềm làm cho thị trường nước ngoài hay bỏ quên.

Thói quen nhỏ để khỏi mất chữ

Thói quen đầu tiên: bộ dữ liệu thử của bạn luôn có những chữ khó. Chữ Đ hoa, chữ ư ơ, chữ có hai dấu như ỗ, ặ, ữ, tên có dấu ở đầu như Ánh, Ước. Nếu những chữ đó đi trọn một vòng từ nhập tới hiện mà không đổi, bạn yên tâm hơn nhiều.

Thói quen thứ hai: khi nhận dữ liệu từ bên ngoài như tệp bảng tính, tệp văn bản cũ, hãy hỏi hoặc kiểm tra nó dùng bảng mã gì trước khi đọc. Đoán sai là nhập cả nghìn dòng rác.

Thói quen thứ ba: chuẩn hoá ở cửa vào. Mọi chữ đi vào hệ thống đều được đưa về một cách lưu thống nhất, để bên trong không bao giờ phải lo hai cách lưu nữa.

Tiếng Việt là một chữ viết khó với máy tính, nhiều dấu, nhiều tầng. Người lập trình Việt hiểu nó kỹ là có một lợi thế mà đồng nghiệp nước ngoài không dễ có.

Câu hỏi thường gặp

Vì sao mở văn bản cũ thấy chữ tiếng Việt bị lỗi?

Vì văn bản đó được gõ bằng một bảng mã riêng thời trước, còn máy bây giờ đọc theo bảng mã chung. Có công cụ chuyển mã giúp đổi văn bản cũ sang bảng mã chung nếu biết nó được gõ theo bảng nào.

Chữ bị thành dấu hỏi chấm trong cơ sở dữ liệu có khôi phục được không?

Thường là không, vì dữ liệu gốc đã bị thay bằng dấu hỏi khi lưu. Chỉ có thể khôi phục từ bản sao lưu hoặc nguồn gốc khác, nên cần cấu hình đúng bảng mã trước khi nhập dữ liệu thật.

Unicode là gì?

Là bảng mã chung của thế giới, có chỗ cho chữ viết của hầu hết các ngôn ngữ, kể cả tiếng Việt với đầy đủ dấu. Dùng thống nhất bảng mã này từ đầu tới cuối là cách phòng lỗi chữ tốt nhất hiện nay.

Vì sao tìm kiếm tiếng Việt có dấu không ra kết quả dù chữ đúng?

Có thể do cùng một chữ được lưu theo hai cách dựng sẵn và tổ hợp. Cần chuẩn hoá chữ về cùng một cách trước khi lưu và trước khi so sánh.

Làm sao để người dùng gõ không dấu vẫn tìm được chữ có dấu?

Thường lưu thêm một bản chữ đã bỏ dấu để tìm kiếm, hoặc dùng quy tắc so sánh không phân biệt dấu. Cần cân nhắc vì cách này cũng có thể gộp nhầm những từ khác nghĩa.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.