GNU Unifont is a free Unicode bitmap font created by Roman Czyborra. The main Unifont covers all of the Basic Multilingual Plane (BMP). The "upper" companion covers significant parts of the Supplementary Multilingual Plane (SMP). The "Unifont JP" companion contains Japanese kanji present in the JIS X 0213 character set.

It is present in most free operating systems and windowing systems such as Linux, XFree86 or the X.Org Server, some embedded firmware such as RockBox, as well as in Minecraft Java Edition. The source code is released under the GPL-2.0-or-later license. The font is released under the GPL-2.0-or-later license with Font-exception-2.0 (embedding the font in a document does not require the document to be placed under the same license); and from version 13.0.04, dual-licensed under SIL Open Font License 1.1. The manual is released under the GFDL-1.3-or-later license.

It became a GNU package in October 2013. The current maintainer is Paul Hardy.

Status 
The Unicode Basic Multilingual Plane covers 216 (65,536) code points. Of this number, 2,048 are reserved for special use as UTF-16 surrogate pairs and 6,400 are reserved for private use. This leaves 57,088 code points to which glyphs can be assigned. Some of these code points are special values that do not have an assigned glyph, but most do have assigned glyphs.

, the GNU Unifont has complete coverage of the Basic Multilingual Plane as defined in Unicode 12.1.0. Its companion fonts, Unifont Upper and Unifont CSUR, have significant coverage of the Supplementary Multilingual Plane and the ConScript Unicode Registry, respectively.

For version 12.1.02, Unifont JP was released, which covers 10,000 Japanese kanji present in the JIS X 0213 character set, some of which are in the Supplementary Ideographic Plane. It is derived from Jiskan16, a public domain font.

Incomplete scripts can be added to by any contributor.

Most of the CJK ideographs on the font has been copied from WenQuanYi's Unibit font with permission.

Unifont stores only one glyph per printable Unicode code point. Because of this, it does not feature the OpenType features needed to render scripts with complex layouts correctly, and it does not correctly position the combining diacritics with base letters if these combinations are not encoded in Unicode in their pre-combined form; the contextual forms (including joining types, and subjoined clusters) are not handled as well. This increases the number of glyphs to include in the basic font and it is not currently possible (because of current OpenType limitations) to encode all the needed glyphs to represent all the required combinations that can exist in a single Unicode plane (this is also true for Chinese fonts that cannot cover completely all ideograms currently encoded in two planes, and also in a third plane). Unifont is then intended to only be used as a "last resort" default font, suitable for simple alphabetic scripts, or to render isolated characters, but will make actual texts difficult or sometimes impossible to read correctly. For correctly rendering Indic abugidas (and semitic abjads if they are written with their optional combining diacritics), other fonts should be specified before this one, and additional fonts will be needed to cover Han ideographs encoded in supplementary planes, or to render most historic (or minority modern) scripts not encoded in the BMP.

Distribution 

Unifont, as of version 15.0.6, is available in TTF (and OTF), BDF, PCF, .hex, and PSF formats for the "standard build". Only the TrueType build is split into two fonts.

A few "specialized versions" have been built by request and made available by Paul Hardy. These include a bitmap TTF (SBIT) with empty glyphs filled with code-point values for FontForge users to read, a PSF bitmap with glyphs for APL programmers, and single-file versions in Roman's .hex format (see below). The actual organization of the source consists of smaller .hex files to be stitched together and converted to other formats in a build.

Vectorization 
Luis Alejandro González Miranda wrote scripts to vectorize and convert the BDF font to TrueType format using FontForge. Paul Hardy adjusted these scripts to handle combining characters (accents, etc.) for the latest TrueType versions.

.hex format 
The GNU Unifont .hex format defines its glyphs as either 8 or 16 pixels in width by 16 pixels in height. Most Western script glyphs can be defined as 8 pixels wide, while other glyphs (notably the Chinese–Japanese–Korean, or CJK set) are typically defined as 16 pixels wide.

The unifont.hex file contains one line for each glyph. Each line consists of a four-digit Unicode hexadecimal code point, a colon, and the bitmap string. The bit string is 32 hexadecimal digits for an 8-pixel-wide glyph, or 64 hexadecimal digits for a 16-pixel-wide glyph. The goal is to create an intermediate format that would facilitate adding new glyphs. 

The bit string is converted from hexadecimal to binary. A 1 bit in the binary bit string corresponds to an 'on' pixel. The pixel's bits are stored line by line, from the top to the bottom, in big-endian order.

Example 
This is an example font containing one glyph, for ASCII capital 'A'. 
<nowiki>
0041:0000000018242442427E424242420000
</nowiki>
The first number is the hexadecimal Unicode code point, with range 0000 through FFFF. Hexadecimal 0041 is decimal 65, the code point for the letter 'A'. The colon separates the code point from the bitmap. In this example, the glyph is 8 pixels wide, so the bit string is 32 hexadecimal digits long.

The bit string begins with 8 zeros, so the top 4 rows will be empty (2 hexadecimal digits per 8 bit byte, with 8 bits per row for an 8 pixel-wide glyph). The bit string also ends with 4 zeros, so the bottom 2 rows will be empty. It is implicit from this that the default font descender is 2 rows below the baseline, and the capital height is 10 rows above the baseline. This is the case in the GNU Unifont with Latin glyphs.

Over time, a number of ways have been created to handle the format. The earliest way is the  Perl script, which converts the string into an ASCII art representation to be edited in a text editor. Another method involves generating a bitmap image grid for an entire range of code points and working with an image editor. In either case, the edited glyphs are later converted back into .hex files for storage.

|+Decoded hexdraw representation of the example
|-

 00 00000000 --------
 00 00000000 --------
 00 00000000 --------
 00 00000000 --------
 18 00011000 ---██---
 24 00100100 --█--█--
 24 00100100 --█--█--
 42 01000010 -█----█-
 42 01000010 -█----█-
 7E 01111110 -██████-
 42 01000010 -█----█-
 42 01000010 -█----█-
 42 01000010 -█----█-
 42 01000010 -█----█-
 00 00000000 --------
 00 00000000 --------

History 
Roman Czyborra created the Unifont format in 1998 after earlier efforts dating to 1994.

In 2008, Luis Alejandro González Miranda wrote a program to convert Unifont into a TrueType font. Paul Hardy modified it later to support combining characters in the TrueType version.

Later, Richard Stallman published Unifont as a GNU package in October 2013, with Paul Hardy as its maintainer.

See also
Fallback font

References 

 The Unicode Consortium: The Unicode 5.0 Standard. 5th, Addison Wesley 2007; .

External links 

GNU Project Archives
Unifoundry.com GNU Unifont page

Free software Unicode typefaces
Unifont
Typefaces and fonts introduced in 1998
Raster typefaces
로만 치보라(Roman Czyborra)가 디자인한 GNU 유니폰트(GNU Unifont)는 중간 비트맵 글꼴 형식을 사용하여 전체 유니코드 BMP ( Basic Multilingual Plane)을 다루는 무료 비트맵 글꼴이다.

리눅스, XFree86 또는 X.org Server 와 같은 대부분의 공개 무료 운영 체제 및 윈도우 시스템 및 RockBox 와 같은 일부 내장 펌웨어에 있다. 글꼴은 GNU GPL(General Public License) 버전 2+에서 글꼴 포함 예외 (문서에 글꼴 포함시 동일한 라이센스하에 문서를 배치할 필요가 없음)와 함께 릴리스된다.

2013년 10월에 GNU 패키지가 되었다.

.hex 글꼴 형식 

GNU 유니폰트(GNU Unifont) .hex 형식은 폭이 8 또는 16 픽셀, 높이가 16 픽셀인 글리프를 정의한다. 대부분의 서구권 스크립트 글리프는 8 픽셀 너비로 정의 할 수 있지만 다른 글리프 (특히 중국어 - 일본어 - 한국어 또는 CJK 세트라고 잘 알려진)는 일반적으로 16 픽셀 너비로 정의된다.

GNU 유니폰트 파일(unifont.hex)에는 각 글리프에 대해 한 줄씩 표시된다. 각 행은 4 자리의 유니 코드 16 진수 코드 포인트, 콜론 및 비트맵 문자열로 구성된다. 비트 문자열은 8 픽셀 폭 글리프의 32 자리 16 진수 또는 16 픽셀 폭 글리프의 64 자리 16 진수이다.

비트 열의 '1'비트는 'on'픽셀에 해당한다. 픽셀 비트는 왼쪽에서 오른쪽으로 위에서 아래로 저장된다.

글꼴은 X11에서 사용하기 위해 BDF 파일로 변환된다.

예 
ASCII 대문자 'A'에 대해 하나의 글리프가 포함된 예제 글꼴

<nowiki>
0041:0000000018242442427E424242420000
</nowiki>

첫 번째 숫자는 0000에서 FFFF 범위의 16 진수 유니코드 코드포인트이다. 16진수(Hexadecimal) 0041은 문자 'A'의 코드 포인트인 10진수 65이다. 콜론은 코드 포인트와 비트맵을 구분하는 역할을 한다. 이 예에서 글리프는 8 픽셀 너비이므로 비트 문자열은 32 자리의 16 진수이다.

비트 문자열은 8 개의 0으로 시작하므로 상위 4 개 행은 비어 있다 (8 비트, 바이트 당 2 개의 16 진수, 8 픽셀 전체 글리프의 경우 행 당 8 비트). 비트 문자열도 4 개의 0으로 끝나기 때문에 하단 2 개의 행은 비어있게된다. 기본 글꼴 디센더가 기준선보다 2 줄 아래에 있고 높이가 기준선보다 10 행 높다는 것은 암묵적인 사실이다. 이것은 라틴 글리프가있는 GNU 유니폰트의 경우이다.

hexdraw Perl 스크립트는 위의 한 줄 문자 모양 정의에서 다음 출력을 생성한다 (더 나은 시각화를 위해 같은 출력으로 오른쪽에 배치)

 0041:
 	––––––––
 	––––––––
 	––––––––
 	––––––––
 	–––##–––
 	––#––#––
 	––#––#––
 	–#––––#–
 	–#––––#–
 	–######–
 	–#––––#–
 	–#––––#–
 	–#––––#–
 	–#––––#–
 	––––––––
 	––––––––

 0041:
 	– – – – – – – –
 	– – – – – – – –
 	– – – – – – – –
 	– – – – – – – –
 	– – – # # – – –
 	– – # – – # – –
 	– – # – – # – –
 	– # – – – – # –
 	– # – – – – # –
 	– # # # # # # –
 	– # – – – – # –
 	– # – – – – # –
 	– # – – – – # –
 	– # – – – – # –
 	– – – – – – – –
 	– – – – – – – –

텍스트 편집기에서 편집 한 다음 동일한 유틸리티를 사용하여 16 진수 문자열로 다시 변환 할 수 있다. 목표는 새로운 글립 문자를 쉽게 추가할 수 있는 중간 형식을 만드는 것이었다.

역사 
로만 치보라(Roman Czyborra)는 1994년에 초기의 노력 끝에 1998년에 유니폰트(Unifont) 포맷을 만들었다.

2008년 Luis Alejandro González Miranda는이 글꼴을 TrueType 글꼴로 변환하는 프로그램을 작성했다. Paul Hardy는 나중에 트루타입(TrueType) 버전의 문자 조합을 지원하도록 수정했다.

마지막으로 리차드 스톨만Richard Stallman 은 2013년 10월 유니폰트(Unifont)라는 GNU 패키지를 폴 하디(Paul Hardy)의 메인 테이너로 지칭했다.

벡터화 프로젝트 
루이스 알레한드로 곤살레스 미란다(Luis Alejandro González Miranda)는 폰트포지(FontForge)를 사용하여 글리프 비트 맵 분포 형식의 유니폰트(unifont.bdf)글꼴을 벡터화하고 트루 타입 형식으로 변환하는 스크립트를 작성했다. 폴 하디 (Paul Hardy)는 최신 트루 타입 버전의 문자 조합 (악센트 등)을 처리하기 위해 이 스크립트를 조정했다.

같이 보기 
 BDF

각주

외부 링크 

 GNU Project Archives
 Unifoundry.com GNU Unifont page

유니폰트
1998년 도입
유니코드
디지털 타이포그래피
글꼴
유니코드 글꼴
오픈 소스 글꼴