fyne解决中文乱码问题


默认 fyne 不支持中文的,如果我们在界面上显示中文会乱码。

下面介绍两种解决方法

配置地址路径编译字体文件为二进制文件
打包文件大小小(无需包含字体文件)大(内含二进制的字体文件)
可移植性需要用户重新配置字体文件配置开箱即用

配置地址路径

  1. 从网络下载或从 C:\Windows\Fonts下拷贝字体文件(.ttf

    经过Anonymous的指正,现在确定无法使用 .ttc

    错误信息

    下面是两个相关issue:

  2. 拷贝到目标目录下

  3. os.Setenv("FYNE_FONT", "字体文件路径") //设置env环境

  4. 但是这样设置只能解决本地运行的乱码,在打包完后还是会乱码
  5. 下面则需要进行

编译字体文件为二进制文件

安装 fyne CLI

go install fyne.io/fyne/v2/cmd/fyne@latest

使用fyne CLI打包

在项目根目录下面运行下面命令(使用 cmd ),生成bundled.go文件

fyne bundle msyh.ttc >> bundled.go
# 打包粗体
fyne bundle -append msyhbd.ttc >> bundled.go

该文件就是字体的二进制文件

注意:执行该命令我们要使用 cmd,不要使用powershell,也不能使用vscode自带的终端,powershell会生成utf-16的字符编码文件,导致编译失败。

创建主题theme.go

在项目根目录下面创建一个theme.go文件,内容如下:

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 resourceMsyhbdTtc
}
if s.Italic {
return theme.DefaultTheme().Font(s)
}
return resourceMsyhTtc

}

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中可以找到

修改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("golang技术栈")
label := widget.NewLabel("golang技术栈(golang-tech-stack.com)-老郭")

myWindow.SetContent(label)

myWindow.Show()
myApp.Run()
}

运行项目查看结果

go run .\main.go .\theme.go .\bundled.go

当然goland直接运行就行


如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


评论
  目录