4 điểm bởi GN⁺ 2025-12-14 | 2 bình luận | Chia sẻ qua WhatsApp
  • Phông chữ mã nguồn mở này bao gồm glyph (hình dạng chữ) cho tất cả ký tự Unicode trên toàn cầu, được duy trì như một phần của dự án GNU.
  • Từ phiên bản 15.1.01, nhờ đóng góp của Minseo LeeHo-seok Ee, đã được đưa vào mã hóa tổ hợp mới (kiểu 6/3/1), áp dụng hệ thống glyph Hangul đã cải tiến.
  • phiên bản mới nhất 17.0.03, nhiều glyph tiếng Trung, tiếng Nhật, chữ Ả Rập, ký hiệu âm nhạc... đã được sửa đổi và bổ sung.
  • Hỗ trợ toàn bộ 65.536 code point của BMP (Basic Multilingual Plane), đồng thời đang tiếp tục mở rộng sang SMP (Supplementary Multilingual Plane) và khu vực CSUR (ConScript Unicode Registry).
  • Được phát hành theo GNU GPLv2+ kèm ngoại lệ nhúng phông chữSIL Open Font License 1.1, vì vậy có thể sử dụng tự do kể cả trong phần mềm thương mại.
  • Dự án phông chữ Unicode mã nguồn mở tiêu biểu với mục tiêu bao phủ đầy đủ hệ chữ viết toàn cầu.

Tổng quan GNU Unifont

  • GNU Unifont là phông chữ gồm glyph cho mọi code point có thể in được của Unicode, được duy trì trong Dự án GNU.
    • Hỗ trợ đầy đủ Basic Multilingual Plane (BMP, U+0000~U+FFFF).
    • Mặt phẳng SMP (U+010000~U+01FFFF) và khu vực CSUR/Under-CSUR cũng đang mở rộng dần.
  • Có thể dùng trong phần mềm thương mại, đồng thời phông dẫn xuất phải được công bố cùng giấy phép.
    • Giấy phép: GNU GPLv2+ (kèm ngoại lệ nhúng phông chữ)SIL Open Font License 1.1.
    • Việc công khai phông dẫn xuất nhằm bảo đảm lợi ích công cộng.

Bản quyền và giấy phép

  • Hàng nghìn glyph là tác phẩm của các đóng góp viên riêng lẻ và đều được bảo vệ theo luật bản quyền của từng quốc gia.
    • Một số là hình dáng chữ có sẵn, một số là thiết kế icon/buộc biểu tượng nên mức bảo hộ quốc tế cao hơn.
  • Một ghi chú về luật bản quyền Đức đã được công bố.
  • Từ phiên bản Unifont 13.0.04 trở đi, dự án phân phối theo giấy phép kép GPL 2+ / SIL OFL 1.1.
    • Việc nhúng phông chữ (embed) vào tài liệu không vi phạm GPL.

Tải phông chữ và định dạng

  • Cung cấp bản build chuẩn và bản có glyph PUA cho CSUR/Under-CSUR.
    • Hỗ trợ nhiều định dạng: OpenType(.otf), PCF, BDF, PSF, HEX.
    • Có thể cài trên Windows và macOS; trên Terminal macOS phải bật Antialias để đọc tốt hơn.
  • Một số engine render bỏ qua thông tin khoảng cách glyph, vì vậy có thể có lỗi hiển thị trên engine mono-space chuyên dụng.

Hạn chế của Unifont

  • Lưu trữ một glyph cho mỗi code point in được.
    • Các chữ của các ngôn ngữ Ấn Độ (Devanagari, Bengali, Tamil...) hoặc chữ biến đổi hình dạng theo vị trí (như tiếng Ả Rập) không render chính xác.
    • Với script phức tạp, khuyến nghị dùng phông OpenType chuyên dụng.

Đóng góp glyph mới

  • Muốn bổ sung glyph mới cần liên hệ trước qua email.
    • Có thể tham gia sau khi phối hợp để tránh làm trùng công việc.
  • Các glyph Kanji 15×16 pixel (Plane 2, 3) thuộc quyền sở hữu bản quyền của chính phủ Trung Quốc không thể đưa vào phông chữ tự do.

Bản phát hành mới nhất — Unifont 17.0

  • Ngày 1/11/2025, phiên bản 17.0.03
    • Sửa hơn 100 chữ Hán có bộ 馬 (ngựa), 鳥 (chim).
    • Phản ánh danh sách chuẩn chữ Hán giản thể của Trung Quốc từ 1935–2013.
    • Bao gồm chuẩn bộ thủ thương mại hiện đại công bố năm 2009.
  • Ngày 18/10/2025, phiên bản 17.0.02
    • Nhiều đóng góp trên Plane 0–3 từ Paul Hardy, David Corbett, 晓晓Akatsuki, Boris Zhang.
    • Sửa đổi nhiều mục cho tiếng Ả Rập, ký hiệu cờ vua, CJK extensions...
  • Ngày 9/9/2025, phiên bản 17.0.01
    • Thêm Arabic Extension-B, ký hiệu tiền tệ, chữ Telugu và Kannada.
    • Trên Plane 1–3 thêm nhiều script như Arabic Extension-C, Sidetic, Tolong Siki, Beria Erfe, Adlam.

Các phiên bản quan trọng trước đây

  • Unifont 16.0 (nửa đầu 2025)
    • Sửa nhiều mục cho tiếng Ả Rập, Hy Lạp, Hangul, ký hiệu âm nhạc.
    • Thêm các script CSUR như Sitelen Pona, Zbalermorna.
  • Unifont 15.1 (2024)
    • Tích hợp mã hóa Hangul Johab 6/3/1 của Ho-seok Ee.
    • Chuyển sang bản build mặc định OpenType thay vì TrueType.
    • Cải tiến lớn đối với Hangul, mở rộng CJK extensions và glyph Wen Quan Yi.

Phạm vi bao phủ glyph

  • Hỗ trợ rộng rãi Plane 0–3, Plane 14 và Plane 15.
    • Plane 0: Basic Multilingual Plane (phủ hầu hết các ký tự chính).
    • Plane 1: Supplementary Multilingual Plane (ký hiệu âm nhạc, tượng hình, chữ cổ...).
    • Plane 2–3: Kanji Hán mở rộng CJK.
    • Plane 14: Tag và trình chọn biến thể.
    • Plane 15: Khu vực riêng tư CSUR/Under-CSUR.

Script CSUR và UCSUR

  • Tengwar, Cirth, Aurebesh, Klingon, Sitelen Pona, Sadalian...
    • Bao gồm nhiều script cho ngôn ngữ giả tưởng.
    • Một số được đánh dấu là chưa hoàn thiện.

Biến thể tiếng Nhật và tiếng Trung

  • Phiên bản unifont_jp cung cấp và hỗ trợ đầy đủ chuẩn JIS X 0213.
    • Ban đầu sử dụng glyph công khai Jiskan16, sau đó thay bằng Izumi16.
  • Phiên bản tiếng Trung bao phủ toàn bộ thước đo quy phạm chữ Hán thông dụng.
    • Dựa trên glyph công khai từ dự án Wen Quan Yi(文泉驛).

Chi tiết kỹ thuật

  • Chuyển sang TrueType dựa trên script của Luis Alejandro González Miranda.
    • Tự động hóa chuyển đổi .hex.sfd.ttf.
  • Mặc định dùng lưới 16×16 pixel, và dự kiến hỗ trợ glyph 32×32 pixel trong tương lai.

Kế hoạch tương lai

  • 16×16 pixel glyph của SMP đã hoàn thiện toàn bộ.
  • Các script phức tạp như Tangut sẽ được thực hiện ở kích thước 32×32 pixel trong giai đoạn tới.
  • Công việc thêm mới các script CSUR vẫn đang tiếp tục.
  • Mọi đóng góp mới đều phải công bố theo điều kiện GPL 2+ / SIL OFL 1.1.

Ý nghĩa của dự án

  • GNU Unifont là phông chữ điển hình nhằm bảo đảm khả năng tiếp cận kỹ thuật số cho hệ chữ viết toàn cầu.
  • Vai trò hạ tầng cốt lõi trong hệ sinh thái mã nguồn mở, i18n, kỹ thuật phông chữ.
  • Nhờ đóng góp cộng đồng liên tục, đây là một dự án nâng cao mức hoàn thiện trực quan của chuẩn Unicode.

Trang phông chữ Hangul của Unifont - Hangul(Hangeul) Font

Nguồn gốc và cấu trúc của Hangul

  • Hangul được vua Sejong sáng tạo trong giai đoạn 1443–1446 và ban hành năm 1446 trong Hunminjeongeum Haerye.
    • Mục tiêu sáng chế được ghi rõ là “để dân chúng dễ học và tiện dụng hàng ngày”.
    • Haerye là sách chú giải giải thích nguyên lý tạo chữ; một bản duy nhất được bảo tồn đã được tìm thấy trong Chiến tranh thế giới thứ hai.
  • Hangul gồm cấu trúc khối âm tiết với ba phần: choseong (âm đầu), jungseong (âm giữa), jongseong (âm cuối).
    • Ví dụ: “Hangul” gồm h+a+n, g+eu+l.
    • Nguyên âm và bán nguyên âm (y, w) đặt ở bên phải hoặc phía dưới âm đầu.

Nguyên lý tạo phụ âm

  • Phụ âm bắt đầu từ năm phụ âm cơ bản mô phỏng hình dạng cơ quan phát âm.
    • Thêm thêm nét để tạo 17 phụ âm ban đầu.
    • Một số phụ âm được tăng cường bằng dạng chữ đôi để biểu thị âm mạnh.
  • Jamo kết hợp (Compatibility Jamo) cũng có trong Unicode; một số jamo cổ không còn sử dụng ngày nay.

Nguyên lý tạo nguyên âm

  • Nguyên âm xuất phát từ khái niệm Trời (yang), Người (jung), Đất (yin) của tam tài.
    • Các thành phần cơ bản là dấu chấm, đường ngang, đường dọc.
  • Ban đầu có 11 nguyên âm; arae-a đã biến mất trong tiếng Hàn chuẩn hiện đại nhưng còn tồn tại trong phương ngữ Jeju.
  • Kết hợp nguyên âm tạo ra diphthong, một số không còn dùng trong tiếng Hàn hiện đại.
  • Bộ Unifont Hangul Jamo hỗ trợ tất cả nguyên âm và diphthong của cả thời cổ lẫn hiện đại.

Vùng Hangul trong Unicode

  • Hangul nằm trong các khoảng Unicode sau:
    • U+1100–U+11FF: Hangul Jamo
    • U+3130–U+318F: Hangul Compatibility Jamo
    • U+A960–U+A97F: Hangul Jamo Extended–A
    • U+AC00–U+D7A3: Hangul Syllables
    • U+D7B0–U+D7FF: Hangul Jamo Extended–B
    • U+FFA0–U+FFDF: Half-width Compatibility Jamo
  • Điều chỉnh vị trí ghép choseong, jungseong, jongseong là trọng tâm thiết kế phông, và có thể thể hiện âm tiết ghép ngay cả trong phông bitmap.

Phông Johab ghép và Unifont

  • Phông mã hóa Johab tạo glyph âm tiết bằng cách ghép choseong, jungseong, jongseong.
    • Dùng trong terminal Hanterm của môi trường Unix X11.
  • Vì phông chữ miễn phí cho Hanterm không tương thích GPL, nên Unifont đã tự thiết kế trực tiếp glyph âm tiết Hangul mới.
    • Quy trình chuyển đổi: script Perl johab2ucs2.pl.hex.bdf.
    • Các phông chữ cũ (iyagi16, johabg16...) bị giới hạn bởi giấy phép riêng cho Hanterm.
  • Sau đó, Unifont đã tạo mới bộ Hangul Syllables trong vài năm để đưa vào phiên bản chính.

Đóng góp mới và cải tiến mã hóa gần đây

  • Minseo Lee (2023): cung cấp bản sửa glyph hiện đại và cổ theo thứ tự Hanterm.
    • Cải thiện script Perl và đồng bộ hóa jamo trong phạm vi Unicode.
  • Ho-seok Ee: đề xuất mã hóa Johab 6/3/1.
    • Cấu trúc kết hợp 6 âm đầu, 3 âm giữa, 1 âm cuối giúp tạo glyph đơn giản hơn so với trước.
    • Đề xuất chuyển code point sang Private Use Area(U+E000–U+E8FF).
    • Phiên bản Unifont 15.1.01 bắt đầu áp dụng cách mã hóa này.

Khối âm tiết Hangul Unicode (U+AC00–U+D7A3)

  • Gồm tổng cộng 11.172 glyph âm tiết.
    • 19 choseong (hoặc glyph đệm 1), 21 jungseong và 27 jongseong (hoặc không có).
    • Công thức ghép: (19×21)×28 = 11.172.
  • Từ bắt đầu bằng nguyên âm dùng choseong ieung làm ký tự đệm.
  • Từ phiên bản Unifont 5.1 trở đi, quy trình tạo khối âm tiết mới được mô tả chi tiết trong tài liệu riêng Generating Hangul Syllables.

2 bình luận

 
joyfui 2025-12-14

Hóa ra đó là nguyên nhân của kiểu phông chữ tiếng Hàn xấu xí trong Minecraft...

 
GN⁺ 2025-12-14
Ý kiến trên Hacker News
  • Chúng tôi dùng GNU Unifont trong cửa sổ văn bản và trình duyệt thuộc tính của Solvespace
    Nó rất hữu ích vì được nhúng trực tiếp vào tệp thực thi. Một số người dùng có các thiết kế chứa ký tự CJK và nó hoạt động tốt trên mọi nền tảng
    Khi xem ghi chú lỗ của CAD, tôi rất ngạc nhiên khi thấy các ký hiệu counter-borecounter-sink đã có sẵn trong Unifont
    Phiên bản web thử nghiệm có thể xem tại đây
    • Đơn giản của phiên bản web thật đáng khen. Solvespace là chương trình MCAD yêu thích của tôi, luôn là công cụ đầu tiên khi tôi cần nhanh chóng làm khung thử cho PCB
      Khi hình học đơn giản, cảm giác sử dụng cực kỳ thoải mái
    • Thật bất ngờ chỉ với chọn phông mà ra hiệu ứng đẹp như vậy. Dĩ nhiên Unifont và toàn bộ Unicode đều chứa vô số công sức của con người, nhưng tôi thích ý tưởng rằng một kỹ sư CAD thời đại đồ đồng vẫn có thể viết tên bằng Linear A
    • Phiên bản web rất sạch sẽ. Solvespace có hạn chế chức năng, nhưng sự linh hoạt khi diễn giải ràng buộc và niềm vui khi dùng nó là áp đảo
      Mong một ngày nào đó được chui vào mã để thay thế hộp thoại modal “không thể tạo ràng buộc”
  • Để nói ngắn gọn cho mọi người, GNU Unifont là phông bitmap
    Nó cung cấp glyph cố định cho tất cả codepoint của BMP và cả một số codepoint ở các plane khác
    Hữu ích cho các trình chỉnh sửa có thể chỉnh sửa văn bản Unicode mà không cần kiến thức render cho từng ngôn ngữ
    Tuy nhiên với những script phức tạp như Devanagari, không có shaping nên không trông như văn bản thật
    • Ở đây, BMP không phải là BitMap mà là Unicode Basic Multilingual Plane. Nói cách khác, đó là vùng 65.536 codepoint đầu tiên
    • Có phải có file riêng cho từng kích thước điểm không? Tôi mới nhận ra mình gần như không biết gì về font
  • Với trang web đó, tôi nghĩ câu mở đầu nên giải thích GNU Unifont là gì. Có vẻ như đây là một font copyleft duy nhất chứa gần như toàn bộ codepoint Unicode
    • Thực ra hai câu thứ hai và thứ ba đã giải thích rất đúng rồi. Nó đã chứa glyph cho mọi codepoint có thể in được của BMP, vì vậy rất phù hợp làm phông dự phòng cuối cùng
      dùng để hiển thị ký tự khi không tìm thấy glyph trong font khác
    • “Gần như tất cả” không có nghĩa là “tất cả”. Tôi có dự án cần render các ký tự CJK hiếm và Unifont không hiển thị đúng
      thay vào đó tôi dùng Jigmo font vì glyph CJK trong đó đầy đủ nhất
    • Ban đầu tôi cũng hơi lúng túng, nhưng khi nhấn “Home” mới nhận ra liên kết không phải landing page
    • Có rất nhiều dự án mã nguồn mở như vậy mà câu đầu tiên thiếu giải thích
    • Tôi nghĩ câu “GNU Unifont là một phần của GNU Project và chứa glyph cho tất cả codepoint có thể in được trong BMP” đã đủ rõ rồi
  • Khi in ra, nó vẫn rất đẹp. Tôi đã biến nó thành một poster xoắn ốc và treo trên tường
    The Mostly Complete Unicode Spiral
    • Hay quá! Tò mò bạn in ở cỡ nào. Các chữ Hán thưa thớt quanh nhánh xoắn chính là cách sắp xếp tự nhiên của Unicode hay là dàn dựng?
      Toàn bộ nhìn như thiên hà, và việc các emoji sắp ở mép ngoài rất ấn tượng. Tìm thấy emoji trái đất cũng rất thú vị
  • Unifont chỉ lưu một glyph cho mỗi codepoint
    nên các script phức tạp (Indic, Arabic, v.v.) không được render đúng
    các trường hợp này nên dùng font OpenType, và Unifont chỉ thích hợp làm fallback font
  • Các site về font thường có ảnh preview kiểu type specimen như “Hello World”. Sẽ rất tốt nếu trang Unifont thêm một ảnh như vậy
  • Nhìn vào cái tên GNU, tôi thấy dù không phải tốt nhất trong mọi mặt, nhưng trong phương diện tôn trọng người dùng thì gần như rất tốt
  • Tôi áp dụng Unifont toàn hệ thống và ép Firefox dùng nó là font duy nhất
    Tôi cũng tắt luôn việc tải web font; trong CSUR (ConScript Unicode Registry) cũng có ký tự do tôi tự tạo
    Với Qt, cài đặt DPI khá khó nhưng QT_FONT_DPI=128 đã khắc phục được. Tôi muốn ở các game như RimWorld cũng chỉ dùng Unifont
    • Tôi tò mò tại sao dùng vậy
    • Tôi cũng đã cài thử, và phải phóng to HN lên 200% mới đọc được. Trên XFCE thì tạm ổn
  • Tôi phải gỡ Unifont để dùng font CJK đẹp trong Firefox
    vì font fallback của nó kỳ lạ khi ưu tiên chọn Unifont trước tiên
    • Để fix thì vào Language and Appearance → Fonts → Advanced trong cài đặt Firefox rồi chỉ định font theo từng script
      không thì không đoán trước được font nào sẽ được chọn
    • Tôi cũng gặp lỗi giống vậy: glyph của Unifont không hiển thị ở Firefox và Chrome. Trên issue tracker của nixpkgs cũng có report liên quan
      Với Noto Color Emoji cũng từng có hiện tượng tương tự. Font thật sự là một thế giới rất tinh vi
  • Tôi đã làm một font cho Playdate dựa trên Unifont
    https://github.com/remysucre/cuniform