Hiển Thị Tiếng Trung Trong Chế Độ Văn Bản - nói dối e blog

Hiển Thị Tiếng Trung Trong Chế Độ Văn Bản

Trong văn phòng, tôi có hai chiếc máy tính bàn. Một chiếc cài Windows, chiếc còn lại chạy song song hai hệ điều hành FreeBSD và Ubuntu. Khi đi làm, tôi thường bật cả hai máy lên, nhưng dành phần lớn thời gian làm việc trên FreeBSD.

Khi sử dụng FreeBSD, tôi gần như không bao giờ khởi động giao diện đồ họa X. Máy này chủ yếu được tôi dùng để viết các chương trình máy chủ hoặc kết nối SSH tới các server khác để quản trị hệ thống. Chế độ chỉ dùng văn bản thuần túy không chỉ mượt mà, nhanh nhẹ mà còn mang lại cảm giác rất dễ chịu.

Tuy nhiên, vẫn tồn tại một vấn đề nhỏ là thỉnh thoảng màn hình xuất hiện vài ký tự tiếng Trung không hiển thị được. Có khi là những chú thích bằng tiếng Trung trong mã nguồn (dù trình độ tiếng Anh của tôi rất tệ nhưng tôi vẫn cố gắng dùng tiếng Anh để viết chú thích), có khi lại là tên tệp tin từ các máy tính khác.

Trước đây, có bạn từng giới thiệu tôi dùng phần mềm zhcon - một hệ thống hỗ trợ tiếng Trung tương tự như thời dùng DOS. Nhưng thứ này hiệu năng cực kỳ tệ hại, dùng nó còn thua cả việc tôi trực tiếp chạy giao diện đồ họa X.

Vào cuối tuần vừa rồi, tôi đã dành hai tiếng đồng hồ để tự viết một chương trình nhỏ giải quyết vấn đề này theo cách của riêng mình.

Chúng ta đều biết rằng chế độ văn bản của VGA cho phép tự thay đổi bộ font chữ thông qua lệnh vidcontrol -f. Chế độ văn bản có thể hiển thị 256 ký tự khác nhau, nhưng thực tế không dùng hết số lượng này. Ví dụ, driver syscons của FreeBSD đã dùng 4 ký tự để vẽ con trỏ chuột. Nguyên lý ở đây chính là sửa đổi font chữ động. Các bạn quan tâm có thể tham khảo mã nguồn tại /usr/src/sys/dev/syscons/scvgarndr.c.

Phương pháp đơn giản nhất là tận dụng 128 ký tự trong khoảng [128,255] để tạm thời hiển thị chữ Hán. Như vậy có thể hỗ trợ tới 64 chữ Hán khác nhau. Trừ đi 4 vị trí bị chiếm bởi con trỏ chuột, thực tế còn lại 62 chữ Hán. Theo kinh nghiệm của tôi thì con số này cơ bản là đủ dùng.

Tôi đã viết một đoạn mã nhỏ thực hiện công việc này, hỗ trợ cả thao tác ống dẫn (pipeline). Chương trình sẽ đọc dữ liệu đầu vào UTF-8 từ stdin, khi phát hiện ký tự không thuộc bảng mã ASCII thì lập tức sinh font điểm ảnh tương ứng (thông qua thư viện freetype), ánh xạ các ký tự này vào khoảng [128,255], sau đó xuất ra stdout. Về cơ bản, giải pháp này đã đáp ứng đầy đủ nhu cầu của tôi.

Nếu có thời gian, tôi hy vọng có thể tích hợp sâu hơn vào syscons. Ví dụ khi nhấn Scroll Lock để cuộn màn hình, đồng thời kiểm tra xem có chữ Hán nào trên màn hình không, nếu có thì tự động chuyển đổi. Trong chế độ Scroll Lock, chúng ta không cần lo lắng về xung đột với bảng mã ASCII, lúc này có thể dùng toàn bộ 256 ký tự. Nếu vẫn chưa đủ, có thể định kỳ thay đổi font chữ và đánh dấu các ký tự không thể hiển thị ngay lập tức bằng dấu “?”.

Nếu muốn nâng cấp hơn nữa, có thể tích hợp thêm bộ gõ tiếng Trung trực tiếp vào hệ thống. Hoặc một phương án khác là sửa đổi trình xem văn bản less để hỗ trợ hiển thị chữ Hán trên console - nếu chữ Hán không hiển thị hết thì tạm dừng lại, đợi người dùng thao tác tiếp.

P/s: Đừng ai hỏi tôi xin mã nguồn nhé. Vì đây chỉ là giải pháp dành riêng cho nhu cầu cá nhân nên tôi viết code hơi cẩu thả, các đường dẫn cũng đều được viết chết cứng, không tiện đưa ra ngoài chia sẻ. Nếu bạn nào muốn tự viết, ngoài việc tham khảo mã nguồn /usr/src/sys/dev/syscons/scvgarndr.c, tôi còn dựa vào /usr/src/usr.sbin/vidcontrol/vidcontrol.c. Thực ra chỉ cần vài chục dòng code là đủ, tự mình làm sẽ học được nhiều hơn. Thật may mắn khi chúng ta có hệ thống mã nguồn mở! :D

À, nếu bạn nào biết trên thế giới đã tồn tại giải pháp nào giống như tôi vừa mô tả (ví dụ chỉ cần nhấn Scroll Lock là có thể hiển thị chữ Hán trên màn hình), xin vui lòng cho tôi biết nhé! :D Nếu bạn nào muốn thử sức phát triển ý tưởng này, chúng ta có thể trao đổi chi tiết hơn ngoài lề.

0%