如何检查用户计算机是否支持Emoji?

25

我想这个问题可以泛化到任何字符上,但我的具体用例是表情符号。

我正在编写一个命令行程序,想要检测它运行的计算机是否安装了可以显示表情符号的字体,以及当前终端应用程序是否会在该字体中显示它们。

目前,我已经使用一个 hack 来过滤掉在非 OS X 系统上的表情符号;但我不想让拥有支持表情符号设置的 Linux 用户失望。我更愿意用“正确的方法”来解决这个问题。

谢谢!


要求于2014年5月8日17:44提出 - ctrlplusb
1
检查区域支持(sic)很简单:请记住它在专用使用区域中。除非有人指出一种检查字形是否按预期显示的方法,否则 OP 的期望将无法得到满足。 - Thomas Dickey
2
请查看:https://askubuntu.com/a/784753/334094 和奖励:http://imgur.com/a/WAKF2 - TheChetan
2个回答

3

您的脚本需要执行以下操作:

  1. 了解可用的系统字体以及字体文件位置(例如C:\ Windows \ Fonts)
  2. 检查这些文件的内容。我认为可以通过技术方式来检查它们,解开文件格式。但是,您也可以通过计算边界框或模拟表情符号字符的字体使用来模拟视觉使用。

如果您熟悉 PHP,则可以计算已知支持表情符号的TTF字体的边界框,并查看该值是否符合预期的字体支持。

您还可以通过使用 GD 在黑色内存图像中绘制白色字体来模拟字体使用,并计算(平均)白色像素的数量,以查看是否符合预期阈值。

你还要求检查当前终端应用程序是否能够显示它们。为此,您需要能够检查配置,这非常棘手,因为您需要能够区分所有终端应用程序。 一个实用的解决方案是使用当前字体显示一些Emoji,并“仅询问用户”它是否可见。毕竟,如果终端应用程序需要支持Emoji,您仍然需要依赖用户?

我非常喜欢允许用户在表情符号上切换的想法。 - ctrlplusb
一个切换按钮几乎是必须的 - 就我个人而言,我讨厌这些该死的东西。原始问题(在我的工作中仍然相关)之所以适用,仅因为它们是主流、被期望的,并且能够带来一定的趣味性/适应某个社区。(对于我来说,任何没有切换按钮的软件都是有问题的,老实说。:P - ELLIOTTCABLE

0

Bash

我还没有在不同的环境中尝试过这些方法,所以我不能确定它们是否有效,但我认为你可以通过这种方法实现。基本的方法是尝试进行一个隐藏的渲染并检查渲染是否成功。例如:

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”包似乎只适用于浏览器 - 它使用画布。 - ctrlplusb
嗯,看起来 if-emoji 需要使用此问题的方法精确地扩展命令行支持。;) - ELLIOTTCABLE
在Linux终端中,wc -m将一个表情符号报告为单个字符,但终端会打印垃圾字符。我认为wc只查看$LC_*。我已经在这里请求POSIX解决方案(https://unix.stackexchange.com/q/535858/143394)。 - Tom Hale
最好的方法似乎是在打印多字节字符之前和之后查看光标位置。一个脚本能否确定终端可以显示哪些字符? - Tom Hale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接