简单粗暴,让我们定义一个函数解决,直接上代码
先看代码
函数代码:
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!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。