fyne中文乱码的两种解决方法
方法一(使用 embed ):
embed 是 Go1.16 新特性,以后会有专门的介绍。
1、拷贝字体到项目目录
项目根目录下新建resource目录,把字体文件拷贝到其中。

2、在resource目录下新建 resource_export.go文件。
resource_export.go 代码:
package resource
import _ "embed"
//go:embed logo.png
var Logo []byte
//go:embed Deng.ttf
var DENGttf []byte3、在根目录下 新建 main.go 和 theme.go
main.go代码
package main
import (
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/widget"
)
func main() {
	myApp := app.New()
	// 设置主题
	myApp.Settings().SetTheme(&MyTheme{})
	myWindow := myApp.NewWindow("边城lang仔")
	label := widget.NewLabel("边城lang仔 GoLang_CUI编程")
	myWindow.SetContent(label)
	myWindow.Show()
	myApp.Run()
}theme.go代码:
package main
import (
    _ "embed"
    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/theme"
    "image/color"
    "win4/resource"
)
type MyTheme struct{}
var _ fyne.Theme = (*MyTheme)(nil)
func (m MyTheme) Font(s fyne.TextStyle) fyne.Resource {
    //return theme.DefaultTheme().Font(s)   
    return &fyne.StaticResource{
       StaticName:    "Deng.ttf",
       StaticContent: resource.DENGttf,
    }
}
func (*MyTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
    return theme.DefaultTheme().Color(n, v)
}
func (*MyTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
    return theme.DefaultTheme().Icon(n)
}
func (*MyTheme) Size(n fyne.ThemeSizeName) float32 {
    return theme.DefaultTheme().Size(n)
}
4、结果

方法二(用fyne命令打包字体文件,适合旧版本):
1、拷贝字体到项目目录
在字体目录(C:\Windows\Fonts)中,拷贝中文字体文件到项目根·目录中(只能用.ttf,fyne2.3版本使用.ttc字体文件会报错)。


2、安装 fyne CLI

go install fyne.io/fyne/v2/cmd/fyne/fyne@latestgo install fyne.io/fyne/v2/cmd/fyne/fyne@latestgo install fyne.io/fyne/v2/cmd/fyne@latest在终端中执行上面命令。安装完成后
fyne --version可以查看fyne版本
fyne CLI 是fyne命令行接口工具。
3、使用 fyne CLI打包
在项目根目录下执行下列命令(使用windows命令行工具 ,win+R -cmd),生成bundled.go文件。
fyne bundle deng.ttf >> bundled.go
fyne bundle -append dengb.ttf >> bundled.go
特别注意:上面的命令在windows命令行工具中执行,不能使用powershell,也不能在编辑器中的终端中执行(vscode 或 goland中都不可以)。因为生成后的bundled.go 应该是 utf-8格式。powershell会生成 utf-16的字符编码文件,导致编译失败。
4、创建主题theme.go
创建一个自己的theme (也就是重写theme)
package main
import (
	"image/color"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/theme"
)
type myTheme struct{}
var _ fyne.Theme = (*myTheme)(nil)
// return bundled font resource
func (*myTheme) Font(s fyne.TextStyle) fyne.Resource {
	if s.Monospace {
		return theme.DefaultTheme().Font(s)
	}
	if s.Bold {
		if s.Italic {
			return theme.DefaultTheme().Font(s)
		}
		return resourceDengbTtf
	}
	if s.Italic {
		return theme.DefaultTheme().Font(s)
	}
	return resourceDengTtf
}
func (*myTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
	return theme.DefaultTheme().Color(n, v)
}
func (*myTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
	return theme.DefaultTheme().Icon(n)
}
func (*myTheme) Size(n fyne.ThemeSizeName) float32 {
	return theme.DefaultTheme().Size(n)
}

Font方法中的两个返回值,到生成的bundled.go中可以找到。resourceDengTtf,resourceDengbTtf。
字体称变量设置一致后,字体文件可移除。theme.go 中resourceDengTtf名字会报红不必理会。
5、修改 main.go 代码,使用主题。
package mainimport (
    "fyne.io/fyne/v2/app"    "fyne.io/fyne/v2/widget")
func main() {
    myApp := app.New()
    // 设置主题
    myApp.Settings().SetTheme(&myTheme{})
    myWindow := myApp.NewWindow("边城lang仔")
    label := widget.NewLabel("边城lang仔 GoLang_CUI编程")
    myWindow.SetContent(label)
    myWindow.Show()
    myApp.Run()
}6、运行结果
go run .\main.go .\theme.go .\bundled.go










