我想这个问题可以推广到任何字符;但我的具体用例是表情符号。
我正在编写一个命令行程序,我想检测运行该程序的计算机是否安装了可以显示表情符号的字体;以及当前终端应用程序是否会以该字体显示它们。
目前,我有一个hack的地方,简单地过滤掉它们在非os X;但我不想欺骗那些使用表情符号设置的Linux用户。我宁愿用"正确的方式"来做这件事。
谢谢!💖
您的脚本必须:
- 知道哪些系统字体可用,以及字体文件在哪里(例如C:Windows fonts)
- 检查这些文件的内容。我想检查它们可以用一种技术的方式来完成,解开文件格式。但你也可以模拟视觉使用,通过计算边界框或模拟字体使用的Emoji字符。
如果你使用PHP,你可以计算已知的表情符号的TTF字体的边界框,看看这个值是否符合支持它的字体的期望。
您还可以通过使用GD在内存中绘制带有白色字体的黑色图像来模拟字体的使用,并计算白色像素的(平均)数量,以查看它是否符合预期的阈值。
您还要求检查当前终端应用程序是否会显示它们。为此,您需要能够检查配置,这是非常重要的,因为您需要能够在所有终端应用程序上进行区分。一个实际的解决方案是用当前字体显示一些表情符号,而只是询问用户是否可见。毕竟,如果终端应用需要支持Emoji,你还是需要依靠用户的。
Bash
我还没有在不同的环境中尝试过这些,所以我不确定它们是否有效——但我认为你可以让这种方法起作用。基本方法是尝试隐藏渲染并检查渲染是否成功。例如:
echo -e 'xE0xA5xA5' | wc -m
wc -m计算呈现的字符数。如果您发现呈现失败导致输入字符串打印,那么这应该是执行预期长度检查的一种方法。如果您发现渲染失败导致渲染默认符号,那么我建议将echo的输出管道放入相等性检查中:
echo -e 'xE0xA5xA5' | grep -q 'some-default-failure-symbol'
一个尝试失败的方法可能看起来很粗糙,但我不认为有一个标准,所以它可能是目前最健壮的方法。
node . js
注意:只能在浏览器中工作,可能是模拟浏览器。不确定模拟浏览器如何或是否会定位本地表情包,但这可能是一件很容易检查的事情。
有一个node.js模块,它使用非常简单的代码来检查系统/浏览器是否支持表情符号。代码尝试渲染表情符号,并可以判断渲染是否成功。npm包被调用:if-emoji
源代码只有几行,如果你熟悉javascript,应该很容易理解(我不会复制和粘贴完整的代码在这里留下Dafrok的信用):https://github.com/Dafrok/if-emoji