WSL에서 Windows font 사용하기 (feat. matplotlib font)

배경

Windows에 WSL(Windows Subsystem for Linux)이 추가되면서 즐겁게 사용하고 있다.

간혹 Linux에서 한글이 깨져 나타나지 않을 때가 있다. 나의 경우에는 R로 plot을 그릴 때 label에 있는 한글, 더 정확히는 non-ASCII 코드들이 깨져 표시되지 않는 경험이 있었다.

이 문제는 Linux(ubuntu) 자체에 이를 표현할 적당한 폰트(font)가 없기 때문이다. Linux에 적당한 font를 찾아 설치해주면 이 문제를 해결 할 수 있다.

하지만 WSL은 Windows와 한집살림을 하고 있는 형편이니 별도의 font 설치 없이 Windows의 font를 공유해서 쓸 수 있다.

방법1

아래와 같이 WSL에서 font 설정을 추가해 주면 windows에서 이미 제공하고 있는 font를 WSL에서도 사용할 수 있다.

/etc/fonts/local.conf 파일(이미 있다면 추가, 없다면 생성)에 아래와 같이 추가한다.

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>

/mnt/c/Windows/Fonts는 windows filesystem에서 font를 저장하고 있는 폴더 위치인데, 다른 곳에 저장되어 있다면 자기에 맞는 경로로 바꾸어준다.

방법2

방법1로 font가 잘 인식되지 않을 때. 이유는 아직 잘 모르겠다. T.T Symbolic Link를 이용해 font folder를 연결시켜 준다.

mkdir -p /home/$USER/.local/share/fonts
ln -s /mnt/c/Windows/Fonts /home/$USER/.local/share/fonts/Windows_Fonts
ln -s /mnt/c/Users/$USER/AppData/Local/Microsoft/Windows/Fonts /home/$USER/.local/share/fonts/Windows_Local_Fonts

폰트 적용

새로 추가한 font를 시스템에 적용하기 위해 아래 명령을 실행시킨다.

fc-cache -r -v
# -f, --force              scan directories with apparently valid caches
# -r, --really-force       erase all existing caches, then rescan
# -s, --system-only        scan system-wide directories only
# -y, --sysroot=SYSROOT    prepend SYSROOT to all paths for scanning
# -v, --verbose            display status information while busy
# -V, --version            display font config version and exit
# -h, --help               display this help and exit

석치된 폰트 리스트를 확인한다.

fc-list

Feat. matplotlib

OS 자체에 font는 설치되었지만, App 수준에서 인식을 안할 수가 있다. 이런 경우에는 App 설정을 살펴보아야 한다. 경험상 R에서의 경우에는 별다른 설정 없이도 문제가 해결되었지만 pythonmatplotlib의 경우에는 별도의 설정이 필요했다. 아래 방법을 참고하자

import matplotlib.font_manager as font_manager
# 시스템에 설치된 ttf 폰트 전체 리스트. 여기에 있다면 일단 폰트는 시스템 상에서 인식되는 것이다.
font_list_system = font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
# matplotlib에서는 아래 리스트에 있는 font만 인식한다. 여기에 없다면 system에 있어도 불러오지 않는다. 
print( [f.name for f in font_manager.fontManager.ttflist] )
# 아래와 같이 ttflist를 추가해 준다. 
for f in font_list_system:
    font_manager.FontManager.addfont( font_manager.fontManager, f)
# 설치 확인. 이제 시스템 폰트가 추가 되었는지 확인한다. 
print( [f.name for f in font_manager.fontManager.ttflist] )

마지막으로 해당 실행 파일에서 어떤 폰트를 사용할 것인지 설정해 주어야 한다.

import matplotlib.pyplot as plt
plt.rc('font', family='NanumGothic')

REF

... ... ... ...
Back