最新的表情符号数据可以在这里找到:
http://unicode.org/Public/emoji/
有一个以表情符号版本命名的文件夹。
作为应用程序开发人员,一个好主意是使用可用的最新版本。
当您查看文件夹内部时,您会在其中看到文本文件。
您应该检查 emoji-data.txt。它包含所有标准表情符号代码。
表情符号有很多小符号代码范围。
最好的支持是在您的应用中检查所有这些。
有人问为什么我们只能在\u后面指定4位,为什么还有5位代码。
这些是由代理对组成的代码。通常使用 2 个符号来编码一个 emoji。
例如,我们有一个字符串。
String s = ...;
UTF-16 表示
byte[] utf16 = s.getBytes("UTF-16BE");
遍历 UTF-16
for(int i = 0; i < utf16.length; i += 2) {
获取一个字符
char c = (char)((char)(utf16[i] & 0xff) << 8 | (char)(utf16[i + 1] & 0xff));
现在检查代理对。表情符号位于第一个平面上,因此请检查 0xd800..0xd83f 范围内的对的第一部分。
if(c >= 0xd800 && c <= 0xd83f) {
high = c;
continue;
}
代理对范围的第二部分是 0xdc00..0xdfff。我们现在可以将一对转换为一个 5 位代码。
else if(c >= 0xdc00 && c <= 0xdfff) {
low = c;
long unicode = (((long)high - 0xd800) * 0x400) + ((long)low - 0xdc00) + 0x10000;
}
所有其他符号都不是对,所以按原样处理它们。
else {
long unicode = c;
}
现在使用 emoji-data.txt 中的数据来检查它是否是表情符号。
如果是,则跳过它。如果没有,则将字节复制到输出字节数组。
最后通过字节数组转换为字符串
String out = new String(outarray, Charset.forName("UTF-16BE"));