解决Kotlin Multiplatform在web中文乱码的问题(会造成额外网络资源消耗)

前言

用kotlin编写安卓应用给我的体验很好,虽然kotlin/wasm目前仍在alpha测试阶段,但我还是想尝试一下用kotlin编写网页的体验。

于是在新项目中添加了web应用,在commonMain中完成了ui的编写,在桌面端和安卓测试没问题以后,信心满满开始运行web应用,结果网页刚打开就出现了这幅画面:

8cb595962e87419db13d77e23ae7f299.png

所有中文竟然都没法正常显示,于是赶快去找解决方法,但奈何用kotlin/wasm的人还是太少(其实也正常,这种测试阶段的框架完全不能拿来投入生产使用,只能自己玩玩),网上并没有相关教程,官方也没有明确的解决方案,只有github和官方社区有寥寥几个相关帖子,受到大佬启发,决定使用自定义字体来补充中文的显示。

(相关问题链接:CJK words can not correctly show in the browser · Issue #3967 · JetBrains/compose-multiplatform

解决思路

这里综合了一下github上的解决方法,由于kotlin/wasm本身无法正常加载中文(后来发现日文也无法正常加载),因此我们可以上传自己的中文字体到资源目录中,并且在程序中自定义文本样式,全部替换为我们自己的字体,即可实现中文的加载。

解决方法

这里使用默认的MaterialTheme作为程序主题,但是要更改其默认字体为自定义字体。

在编写代码之前先把字体文件放到wasmJsMain的resources文件夹下(字体文件为.ttf)

f43cd14a36ce41238ecd7f172abb28d5.png

为了在WebAssembly中使用字体数据,需要将字体转换为二进制数据,因此我们在目录中加载字体资源后要转化为ArrayBuffer,并在之后转换为ByteArray来存储字节数据。

但是这里需要注意,ArrayBuffer是JavaScript的类型,无法直接转换为ByteArray,因此我们需要定义一个拓展函数来实现ArrayBuffer向ByteArray的转换,从而方便使用kotlin进行处理。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值