博客 / 詳情

返回

go語言fyne框架中文亂碼解決方法

簡單粗暴,讓我們定義一個函數解決,直接上代碼

先看代碼

函數代碼:

import "github.com/flopp/go-findfont"

func init() { //init()是我認為定義的函數名,可修改
    //設置中文字體:解決中文亂碼問題
    fontPaths := findfont.List()
    for _, path := range fontPaths {
        if strings.Contains(path, "msyh.ttf") || strings.Contains(path, "simhei.ttf") || strings.Contains(path, "simsun.ttc") || strings.Contains(path, "simkai.ttf") {
            os.Setenv("FYNE_FONT", path)
            break
        }
    }
}

在項目中的應用

package main
 
import (
    "os"
    "strings"
 
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/widget"
    "github.com/flopp/go-findfont"
)
 
func init() {
    //設置中文字體:解決中文亂碼問題
    fontPaths := findfont.List()
    for _, path := range fontPaths {
        if strings.Contains(path, "msyh.ttf") || strings.Contains(path, "simhei.ttf") || strings.Contains(path, "simsun.ttc") || strings.Contains(path, "simkai.ttf") {
            os.Setenv("FYNE_FONT", path)
            break
        }
    }
}
 
func main() {
 
    myApp := app.New()
 
    myWindow := myApp.NewWindow("中文")
    label := widget.NewLabel("漢字")
 
    myWindow.SetContent(label)
 
    myWindow.Show()
    myApp.Run()
}

現在運行起來就不會有任何中文亂碼問題了

代碼分析

Fyne的亂碼問題主要是因為程序無法找到含有中文字體的字體文件(.ttf和.ttc文件)。

在解決亂碼問題所使用的初始化函數init()中,我調用了github上的開源庫"github.com/flopp/go-findfont"。
這個庫的作用是讓程序自動找尋字體文件的所在之處。

亂碼原因分析

注:該分析適合有java Jframe框架使用經驗的人查看。

很多人認為fyne框架的這個亂碼是由於代碼文件沒有設置unicode編碼引起的,實則不然。

golang的fyne與java的Jframe不同:

Jframe是自帶字體的,所以程序員就算不設置字體 ,java的虛擬機運行時會自動給Jframe框架匹配字體。

而fyne則沒有給出默認字體,它只給出了一個GUI界面的框架,並且吝嗇地提供了一些必備的英文字符。

所以,當運行fyne時,程序員需要主動給它提供一個字體路徑,讓它去尋找。

我看到網上一些教程是讓程序員將字體打包到程序源碼中(見https://blog.csdn.net/ZHOUAXING/article/details/125162576),並將其作為程序資源編譯。這樣的確能解決中文亂碼問題,但是會使編譯出的程序體積變大(畢竟打包進去了一個字體文件。)

所以我採用了以上方法,讓程序運行時自己去尋找字體文件——Solve Perfectly!

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.