表情符号
首先让我们了解什么是表情符号。表情符号是许多字符的组合,因为它以 Unicode 实现。比如“浅肤色男性耸肩表情”其实就是以下5个字符的组合:
0x1f937 0x1f3fb 0x200d 0x2642 0xfe0f
- 0x1f937: Person Shrugging
- 0x1f3fb: Light skin tone
- 0x200d: Zero width joiner (Used to combine two characters, in this case
the Light skin tone Person shrugging and the
male sign.)
- 0x2642: Male sign
- 0xfe0f: Variation selector-16 (Used to indicate an Emoji)
JavaScript 中的 Unicode
好消息是,我们可以简单地删除 0x1f3fb 以获得没有肤色的版本。坏消息是,JavaScript 不支持 UTF-16,所以它显示为
0xd83e 0xdd37 0xd83c 0xdffb 0x200d 0x2642 0xfe0f
└───────── Uh oh ─────────┘
这是不正确的,因为它不知道surrogate pair 是什么。要计算正确的代码点,我们必须引用UTF-16 standard 并进行必要的更正。幸运的是,someone else already did the hard work 在这里我将字符串转换为正确的 UTF-16 并删除我不想要的部分:
// Defines the range of skin tone modifiers
var modifiersMin = 0x1F3FB, modifiersMax = 0x1F3FF;
// Emoji with U+1F3FB "light skin tone" modifier combined with "male sign"
var string = new UnicodeString("??♂️");
// Removes the modifier
string = new UnicodeString(string.codePoints.filter(c => {
return c < modifiersMin || c > modifiersMax;
});
alert(string.toString());
你可以在这里看到它的实际效果:https://jsfiddle.net/DerekL/b5848tor/
既然您了解了表情符号的工作原理,您还可以这样做:
// The replace function that you would like
var skinToneModifiers = new RegExp("\ud83c[\udffb-\udfff]", "g");
var string = "??♂️";
// Remove skin tone modifier
string = string.replace(skinToneModifiers, "");
在不了解其背后的概念的情况下,它的工作速度更快,但并不完全清楚它为什么工作。
查看实际操作:https://jsfiddle.net/DerekL/sn4n689r/