Nợ kỹ thuật trong việc hiển thị chữ Ả Rập: Khi typography truyền thống gặp phải giới hạn của web
Bài viết phân tích sâu về những thách thức kỹ thuật khi hiển thị tiếng Ả Rập trên trình duyệt web, từ việc căn chỉnh dòng văn bản (justification) đến lịch sử phức tạp của Unicode và các thuật toán định dạng văn bản hai chiều (bidi). Tác giả chia sẻ trải nghiệm thực tế về việc xử lý "nợ kỹ thuật" typography và sự khác biệt giữa các quy tắc viết tay truyền thống với khả năng hạn chế của CSS hiện tại.

Mọi chuyện bắt đầu bằng một phiếu hỗ trợ frontend (ticket) tưởng chừng đơn giản: một đoạn văn bản tiếng Ả Rập trên bảng điều khiển khách hàng hiển thị với lề trái bị gợn sóng (ragged left), trong khi đội ngũ thiết kế yêu cầu văn bản phải được căn đều hai bên (justified). Đối với các ngôn ngữ Latinh, đây chỉ là một dòng CSS text-align: justify. Nhưng với tiếng Ả Rập, vấn đề này mở ra một hành trình kỹ thuật sâu sắc, kéo dài hàng thế kỷ.
Vấn đề không nằm ở mã nguồn ứng dụng, mà nằm ở chính trạng thái của typography tiếng Ả Rập trên nền tảng web hiện đại. Đây là câu chuyện về sự xung đột giữa một nghệ thuật viết tay truyền thống hoàn hảo và các giới hạn kỹ thuật của phần mềm.
Vấn đề của việc căn chỉnh dòng văn bản (Justification)
Trong tiếng Latinh, để căn đều một dòng văn bản, chúng ta thường kéo giãn khoảng trắng giữa các từ. Tuy nhiên, đối với tiếng Ả Rập, phương pháp này được coi là xấu xí và phá vỡ cấu trúc thẩm mỹ. Truyền thống viết tay Ả Rập sử dụng một kỹ thuật gọi là Kashida (hay Taṭwīl): kéo dài chính các nét chữ nối thay vì khoảng trắng.
Một trang Qur'an thế kỷ 14 hiển thị kỹ thuật căn chỉnh dòng hoàn hảo
Hình ảnh trên là một trang Qur'an từ thế kỷ 14. Mọi dòng đều đều hai mép, nhưng không có bất kỳ khoảng trắng nào bị kéo giãn. Việc căn chỉnh diễn ra bên trong chính các từ chữ. Tuy nhiên, trên trình duyệt web năm 2026, khi bạn áp dụng text-align: justify cho tiếng Ả Rập, kết quả thường là những khoảng trắng thô kệch, làm vỡ nát sự liền mạch của văn bản.
Cấu trúc phức tạp của chữ Ả Rập
Để hiểu tại sao máy tính gặp khó khăn với tiếng Ả Rập, cần nhận thức rằng tiếng Ả Rập luôn là chữ viết nối (cursive). Không có sự phân biệt giữa chữ in và chữ viết tay. Mỗi ký tự sẽ thay đổi hình dạng tùy thuộc vào vị trí của nó trong từ: đứng riêng lẻ (isolated), ở đầu (initial), ở giữa (medial), hoặc ở cuối (final).
Ví dụ, chữ "Heh" (ه) sẽ có hình dạng khác nhau tùy vị trí. Một font chữ tiếng Ả Rập không chỉ là một tập hợp các hình ảnh, mà thực chất là một chương trình nhỏ — một "shaping engine" (bộ máy định hình) — phải quyết định hình dạng nào sẽ được hiển thị tại thời điểm chạy.
Trước khi có các công nghệ hiện đại như OpenType, các hệ thống cũ (như DOS hay Windows sơ khai) đã mã hóa trực tiếp các hình dạng này thành các ký tự riêng biệt (Arabic Presentation Forms). Điều này tạo ra một "nợ kỹ thuật" khổng lồ: cùng một từ có thể được lưu trữ dưới hai mã Unicode khác nhau (một dạng hiện đại, một dạng dạng trình bày cũ). Chúng nhìn giống hệt nhau khi hiển thị, nhưng lại hoàn toàn khác nhau về mặt dữ liệu, khiến các tính năng tìm kiếm trở nên vô dụng.
Thách thức với thuật toán hai chiều (Bidi) và các con số
Tiếng Ả Rập được viết từ phải sang trái (RTL), nhưng khi trộn lẫn với các số liệu hay tiếng Anh (LTR), mọi thứ trở nên phức tạp. Thuật toán Bidirectional (Bidi) của Unicode phải xử lý việc sắp xếp thứ tự hiển thị sao cho hợp lý.
Một vấn đề kinh điển là các con số. Trong tiếng Ả Rập, có đến ba bộ số khác nhau đang được sử dụng: số phương Tây (0-9), số Ả Rập-Ấn Độ (٠-٩), và số mở rộng (۰-۹). Tệ hơn, các dấu phân cách hàng nghìn và thập phân cũng khác nhau tùy theo vùng miền.
Một ví dụ điển hình về lỗi Bidi là số điện thoại. Một chuỗi số như 010-1234-5678 có thể bị hiển thị ngược chiều thành 5678-1234-010 nếu nằm trong một đoạn văn tiếng Ả Rập, vì các dấu gạch nối bị thuật toán hiểu sai về hướng hiển thị.
Web hiện tại và các giải pháp "chữa cháy"
Đáng buồn thay, tiêu chuẩn web hiện tại vẫn chưa hỗ trợ tốt việc căn chỉnh Kashida. CSS từng có thuộc tính text-justify: kashida (được Internet Explorer 5.5 triển khai năm 2000!), nhưng sau đó đã bị loại bỏ vì thiếu sự hỗ trợ từ các trình duyệt khác. Ngày nay, Chrome, Firefox hay Safari đều mặc định kéo giãn khoảng trắng khi căn chỉnh tiếng Ả Rập, tạo ra những "dòng sông" khoảng trắng trắng trợt trong văn bản.
Các nhà phát triển thường phải dùng đến các giải pháp "hack", chẳng hạn như chèn thủ công ký tự U+0640 TATWEEL vào văn bản để kéo dài nét chữ. Tuy nhiên, đây không phải là giải pháp bền vững vì nó làm hỏng dữ liệu gốc, gây khó khăn cho tìm kiếm và sao chép.
Trang Qur'an Cairo 1924 được in bằng máy móc kim loại, nền tảng cho font chữ Amiri hiện đại
Một điểm sáng trong bối cảnh này là font chữ Amiri. Được phát triển bởi bác sĩ người Ai Cập Khaled Hosny, Amiri là nỗ lực tái tạo lại font chữ của nhà in Amiria (người đã in ấn bản Qur'an Cairo năm 1924) dưới dạng kỹ thuật số. Đây được coi là một trong những font tiếng Ả Rập miễn phí tốt nhất hiện nay, hỗ trợ tốt các tính năng OpenType và Kashida.
Kết luận
Việc hiển thị tiếng Ả Rập trên web không chỉ là vấn đề kỹ thuật, mà còn là vấn đề về sự tôn trọng lịch sử và thẩm mỹ của một ngôn ngữ cổ xưa. Những lỗi hiển thị mà chúng ta thấy hàng ngày là kết quả của hàng thế kỷ "nợ kỹ thuật" tích lũy — từ những lần in ấn đầu tiên sai lệch ở châu Âu thế kỷ 15, cho đến các quyết định thiết kế phần mềm vội vàng trong thời đại máy tính.
Để giải quyết triệt để, các trình duyệt và tiêu chuẩn web cần phải coi trọng các quy tắc typography phi Latinh ngang hàng với tiếng Anh, thay vì coi chúng là các trường hợp ngoại lệ cần xử lý bằng các giải pháp tạm thời.



