我想这个问题可以泛化到任何字符上,但我的具体用例是表情符号。
我正在编写一个命令行程序,想要检测它运行的计算机是否安装了可以显示表情符号的字体,以及当前终端应用程序是否会在该字体中显示它们。
目前,我已经使用一个 hack 来过滤掉在非 OS X 系统上的表情符号;但我不想让拥有支持表情符号设置的 Linux 用户失望。我更愿意用“正确的方法”来解决这个问题。
谢谢!
我想这个问题可以泛化到任何字符上,但我的具体用例是表情符号。
我正在编写一个命令行程序,想要检测它运行的计算机是否安装了可以显示表情符号的字体,以及当前终端应用程序是否会在该字体中显示它们。
目前,我已经使用一个 hack 来过滤掉在非 OS X 系统上的表情符号;但我不想让拥有支持表情符号设置的 Linux 用户失望。我更愿意用“正确的方法”来解决这个问题。
谢谢!
您的脚本需要执行以下操作:
如果您熟悉 PHP,则可以计算已知支持表情符号的TTF字体的边界框,并查看该值是否符合预期的字体支持。
您还可以通过使用 GD 在黑色内存图像中绘制白色字体来模拟字体使用,并计算(平均)白色像素的数量,以查看是否符合预期阈值。
你还要求检查当前终端应用程序是否能够显示它们。为此,您需要能够检查配置,这非常棘手,因为您需要能够区分所有终端应用程序。 一个实用的解决方案是使用当前字体显示一些Emoji,并“仅询问用户”它是否可见。毕竟,如果终端应用程序需要支持Emoji,您仍然需要依赖用户?:P
) - ELLIOTTCABLEBash
我还没有在不同的环境中尝试过这些方法,所以我不能确定它们是否有效,但我认为你可以通过这种方法实现。基本的方法是尝试进行一个隐藏的渲染并检查渲染是否成功。例如:
echo -e '\xE0\xA5\xA5' | wc -m
wc -m 可以计算渲染的字符数。如果您发现无法渲染导致输入字符串打印出来,那么这应该是执行预期长度检查的一种方法。如果您发现无法渲染会导致默认符号被渲染,则建议将 echo 的输出导入到等式检查中:
echo -e '\xE0\xA5\xA5' | grep -q 'some-default-failure-symbol'
尝试失败的方法可能看起来有些不专业,但我认为目前还没有标准,所以这可能是最稳健的方法。
Node.js
注意:仅在浏览器中工作,可能是一个模拟浏览器。不确定模拟浏览器如何或是否能够找到本地的表情包,但这可能是一个容易检查的事情。
有一个 node.js 模块使用非常简单的代码来检查系统/浏览器是否支持表情符号。该代码尝试呈现表情符号,并可以判断呈现是否成功。
npm 包名为: if-emoji
源代码只有几行,如果您熟悉 JavaScript,应该很容易理解(我不会在此复制和粘贴完整代码以留给 Dafrok 获得荣誉): https://github.com/Dafrok/if-emoji
if-emoji
需要使用此问题的方法精确地扩展命令行支持。;)
- ELLIOTTCABLEwc -m
将一个表情符号报告为单个字符,但终端会打印垃圾字符。我认为wc
只查看$LC_*
。我已经在这里请求POSIX解决方案(https://unix.stackexchange.com/q/535858/143394)。 - Tom Hale