簡單粗暴,讓我們定義一個函數解決,直接上代碼
先看代碼
函數代碼:
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!