简单粗暴,让我们定义一个函数解决,直接上代码

先看代码

函数代码:

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!


愚人猫
9 声望0 粉丝

现世的挣扎者……