2016년 3월 31일 목요일

GXUI 에서 한글 출력하기

github.com/google/gxui에서 GUI 를 사용하려고 했는데, 한글 출력이 안 됐다. 어느 일본인이 Twitter 앱을 만든 앱이 하나 있길래 봤는데 솔직히 어떻게 구성을 했는지 잘 이해가 되지않았다. 입문자는 최대를 뻘짓을 통해서 해결 할 수 밖에 없다.

func appMain(driver gxui.Driver) {
    g := new(gxuitter)
    g.LoadConfig()
    theme := dark.CreateTheme(driver)
    fontFile := g.ConfigString("FontFile")
    fontSize := g.ConfigInt("FontSize")
    if fontSize <= 0 {
        fontSize = 12
    }
    if fontFile != "" {
        b, err := ioutil.ReadFile(fontFile)
        font, err := driver.CreateFont(b, fontSize)
        if err == nil {
            theme.SetDefaultFont(font)
        }
    }
}

위에는 appMain 에 font를 설정하는 방법

golang.kr 에서 질문 글을 올려서 해결책을 찾게 되었습니다.

한글이 나오지 않는 이유는 기본으로 제공하고있는 roboto 폰트가 한글을 지원하지 않는 것이었습니다. 저도 go 언어는 기본적으로 utf-8 로 작성되는 언어인데 한글 출력이 안된다는 점을 이상하게 생각했는데 의외로 간단한 문제 였습니다.

1, 첫번째 방법은 나눔폰트를 go generate 하는 방법

go generate 란

매크로를 활용해야 하는 경우라면 지금까지 나열한 방법으로 해결되지 않습니다. C 언어 등에서 제공하는 매크로는 전처리기를 통하여 소스 코드를 혹장하여 컴파일합니다. 비슷한 도구가 go 도구에 있습니다.

300p, 책 디스커터리 Go 안에서

$GOPATH/src/github.com/google/gxui/gxfont/mkfont.go 파일에서 urls 이름의 map에 적당한 한글폰트 하나를 추가합니다.

var urls = map[string]string{
    "roboto_regular":  "https://github.com/google/fonts/raw/master/apache/roboto/Roboto-Regular.ttf",
    "droid_sans_mono": "https://github.com/google/fonts/raw/master/apache/droidsansmono/DroidSansMono.ttf",
    "nanumgothic":     "https://github.com/google/fonts/raw/master/ofl/nanumgothic/NanumGothic-Regular.ttf",
}
$ go run mkfont.go

mkfont.go 파일을 이용해서 generation 합니다.

func appMain(driver gxui.Driver) {
    theme := flags.CreateTheme(driver)

    fontdata, err := ioutil.ReadFile("malgun.ttf")
    if err != nil {
        log.Fatalln(err)
    }
    font, err := driver.CreateFont(fontdata, 12)
    if err != nil {
        log.Fatalln(err)
    }
    theme.SetDefaultFont(font)

nanumgothic.go 라는 파일이 생성 된 것을 확인 할 수 있을 것입니다.

mkfont.go 와 같은 디렉토리의 파일 $GOPATH/src/github.com/google/gxui/gxfont/gxfont.go 파일의 Default를 robo_regular에서 nanumgothic 으로 바꿉니다.

var (
    // Default is the standard GXUI sans-serif font.
    Default []byte = inflate(nanumgothic)

    // Monospace is the standard GXUI fixed-width font.
    Monospace []byte = inflate(droid_sans_mono)
$ go install

로 컴파일 해주면, 이제 한글이 보입니다.

2번째 방법은,

gxui.Driver 를 통해서 theme에 SetDefaultFont 를 설정하는 방법입니다.

실행 파일과 같은 곳에 malgun.ttf 파일을 복사해 넣고,

func appMain(driver gxui.Driver) {
    theme := flags.CreateTheme(driver)

    fontdata, err := ioutil.ReadFile("malgun.ttf")
    if err != nil {
        log.Fatalln(err)
    }
    font, err := driver.CreateFont(fontdata, 12)
    if err != nil {
        log.Fatalln(err)
    }
    theme.SetDefaultFont(font)

다음과 같은 fontdata 와 font 코드를 추가해 줍니다.

$ goimports -w

를 통해서 import 라인을 다시 수정하면 됩니다.