Home 외국어가 깨지지 않는 폰트
Post
Cancel

외국어가 깨지지 않는 폰트

PDFBox를 이용해서 PDF파일을 생성/다운로드 하는 기능이 있다.
이 때, 출력 내용에 외국어나 특수문자가 포함될 경우 오류가 발생하기도 한다.

단순히 텍스트 인코딩에서는 UTF-8정도면 해도 웬만해서는 잘 깨지지 않는다.
인코딩에서 지원하지 않는 문자라고 해도 그 문제가 있는 텍스트만 깨지고 나머지 유효한 텍스트는 정상적으로 출력이 된다.
그런데 PDF파일 생성 과정에서 Exception이 발생하면 PDF파일 자체가 생성되지 못하여 파일 출력기능 자체가 고장나게된다.

이 때, 아래와 같은 오류가 발생한다.

1
2
3
4
5
java.lang.IllegalArgumentException: No glyph for U+0166 in font NotoSansCJKkr-Regular
    at org.apache.pdfbox.pdmodel.font.PDCIDFontType2.encode(PDCIDFontType2.java:400)
    at org.apache.pdfbox.pdmodel.font.PDType0Font.encode(PDType0Font.java:351)
    at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:316)
    at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:345)

내용을 보면, NotoSansCJKkr-Regular라는 폰트에서 U+0166이라는 문자 형태를 표현할 수 없다는 뜻이다.

U+0166은 이렇게 생긴 문자다.

1

[https://www.compart.com/en/unicode/U+0166]

그래서 단순하게도 저 문자를 포함하는 폰트를 사용하면 문제 없이 작동하는 모습을 볼 수 있다.

이때 주의 할 점은, NotoSansCJKkr-Regular에서는 한글이 유효하고 특수문자가 깨지듯이, 새로운 폰트가 특수문자가 유효하지만 한글이 깨지는 폰트일 수도 있기 때문에 내가 다루려는 모든 언어와 특수문자에 유효한지 확인해야 한다.

또한, 가시성이나 심미성을 이유로 적당한 폰트를 선정했을 것인데, 폰트를 바꾸면 문서 전체의 디자인이 바뀔 수 있다는 것도 주의해야 한다.

그런 경우를 대비해서 한국인 입장에서 많이 사용하는 한국어, 영어, 일본어, 한자 등은 NotoSansCJKkr-Regular를 사용하고 그 외의 외국어와 특수문자에 대해서 다른 폰트로 적용되게 해야 할 것이다.

그러면 외국어와 특수문자를 어떤 폰트로 처리할 것인지를 선정하는 것이 핵심 문제가 된다. 태국어(ภาษาไทย)를 표현할 수 있는 폰트를 적용시켜놨는데, 러시아어(Ру́сский)를 출력해야 한다면? 분명히 오류가 발생할 여지가 있다. 한글자씩 어떤 언어인지를 구별하여 폰트를 적용하기에는 언어의 경우의 수가 너무 많고 코드가 지저분해지기 때문에 현실적으로 각 언어에 대응하는 폰트를 적용하기에는 쉽지 않다. 그래서 최대한 많은 언어와 특수문자를 지원하는 만능 폰트를 하나 정해서 외국어 처리를 전담시키는 것이 현실적으로 타당하다.

내 경우에서는 Arial Unicode MS를 만능 폰트로 선정했다.

Arial Unicode MS 이름에서부터 알 수 있듯이 유니코드를 처리하는 폰트임을 추측할 수 있다. 또한 위의 Exception Trace를 보면, PDFBox가 문자를 유니코드로 인식하고 있음을 알 수 있기 때문에 Arial Unicode MS를 쓰는 것은 합리적인 접근으로 보인다. 그런데, 인터넷에 Arial Unicode MS를 검색해도 Arial Unicode MS가 얼마나 많은 언어를 지원하는지 정확히 찾을 수 없었다.

2

그래서 부득이하게 ChatGPT에게 물어봤는데, 다양한 언어를 지원한다고 대답하기에 Arial Unicode MS를 사용하는 것에는 문제가 없을 것으로 보인다.
Arial Unicode MS를 PDF파일을 생성하는 서비스에 적용하는 것은 기술적으로 어렵지 않다. 또 다시 새롭게 대두되는 문제는 Arial Unicode MS는 무료폰트가 아니라는 것이다.

3

[https://www.fonts.com/content/microsoft-typography]

물론 라이센스를 구매하여 해당 폰트를 사용할 수 있지만, 비용도 비용이고, 연간 구독제이기 때문에 해당 폰트를 구매하기 위하여 복잡한 절차를 거쳐야 할 것으로 보인다. 그래서 무료로 사용할 수 있는 새로운 폰트를 찾아봤다. 위에서 Unicode라는 핵심 키워드를 이용해서 찾아봤다.

4

[https://en.wikipedia.org/wiki/Unicode_font]

위와 같이 유니코드를 지원하는 폰트를 찾았다. 앞서 살펴본 Exception Trace의 내용에 Glyph라는 키워드가 있었기 때문에 위의 목록에서 Glyphs가 높으면서 Free License인 것을 찾아봤다.

5

그 결과 Sun-ExtA를 사용하는 것으로 결정했고, 앞서 적용해 봤던 Arial Unicode MS와 같이 정상적으로 동작하는 것을 확인했다.

6

This post is licensed under CC BY 4.0 by the author.

프리랜서만 좋은일 시키는 회사

Bean이름이 충돌했을 때 발생하는 일