节点画布对未知字符使用后备字体

Aci*_*bus 6 javascript node.js node-canvas discord.js

我正在使用 Node-Canvas 在图像上打印文本,并试图弄清楚如何确保奇怪的字符正确显示,即使主要字体无法显示它们。

\n

从我在网上找到的内容来看,你必须使用registerFont一种可以显示这些字符的字体来依靠,但它似乎不会自动使用它,而且我找不到任何关于如何告诉它确实使用的内容后备字体。

\n

当注册可以显示字符(Code2000)的字体时,它仍然显示为这样(“\xe1\x97\xa9”字符未正确显示):

\n

\n

(尝试打印HELLO WORLD, I\'M \xe1\x97\xa9c\xc5\x82!
\n这是我的代码:

\n
//load some fallback fonts for custom characters (arial & code2000 in this case)\ncanvas.registerFont(\'./Assets/Fonts/arial.ttf\', {family: \'Arial\'})\ncanvas.registerFont(\'./Assets/Fonts/code2000.ttf\', {family: \'Code2000\'})\n//load the Uni Sans Heavy custom font\ncanvas.registerFont(\'./Assets/Fonts/Uni_Sans_Heavy.ttf\', {family: \'Uni Sans\'})\nlet cnvs = canvas.createCanvas(740, 260)\nlet ctx = cnvs.getContext(\'2d\')\nctx.fillStyle = "#fff"\nctx.font = \'50px Uni Sans\'\nctx.fillText(`HELLO WORLD, I\'M \xe1\x97\xa9c\xc5\x82!`, 50, 100);\n    \nmessage.channel.send({files: [{ attachment: cnvs.toBuffer() }]}).catch(allerrors)\n
Run Code Online (Sandbox Code Playgroud)\n

“Code2000”字体肯定可以正确显示字符,所以我认为它会自动回退到该字符,但事实并非如此。\n有没有办法自动使用回退字体?如果没有,我如何告诉它在哪些字符上使用它?

\n

小智 3

您只需在设置字体时指定“Code2000”即可。用逗号分隔的连续字体用作后备字体。

ctx.font = '50px Uni Sans, Code2000'
Run Code Online (Sandbox Code Playgroud)

我自己对此进行了测试,效果非常好。