角色(有两个女人,一个女孩和一个男孩的家庭)编码如下:
U+1F469
WOMAN
,
?U+200D
ZWJ
,
U+1F469
WOMAN
,
U+200D
ZWJ
,
U+1F467
GIRL
,
U+200D
ZWJ
,
U+1F466
BOY
所以它非常有趣地编码; 单元测试的完美目标.然而,斯威夫特似乎不知道如何对待它.这就是我的意思:
"???".contains("???") // true
"???".contains("") // false
"???".contains("\u{200D}") // false
"???".contains("") // false
"???".contains("") // true
Run Code Online (Sandbox Code Playgroud)
所以,斯威夫特说它包含自己(好)和一个男孩(好!).但它说它不包含女人,女孩或零宽度木匠.这里发生了什么事?斯威夫特为什么知道它包含一个男孩而不是女人或女孩?我能理解它是否将它视为一个单一的角色并且只识别它包含它自己,但事实上它有一个子组件,没有其他人困惑我.
如果我使用类似的东西,这不会改变"".characters.first!
.
更令人困惑的是:
let manual = "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}"
Array(manual.characters) // ["?", "?", "?", ""]
Run Code Online (Sandbox Code Playgroud)
即使我将ZWJ放在那里,它们也不会反映在字符数组中.接下来是一个小小的说法:
manual.contains("") // false
manual.contains("") // false
manual.contains("") // true
Run Code Online (Sandbox Code Playgroud)
所以我得到了与字符数组相同的行为...这是非常烦人的,因为我知道数组的样子.
如果我使用类似的东西,这也不会改变"".characters.first!
.
我正在寻找一个简单的功能,可以删除Instagram评论中的表情符号字符.我现在尝试过的(我在SO和其他网站上找到的示例代码中有很多代码):
// PHP class
public static function removeEmoji($string)
{
// split the string into UTF8 char array
// for loop inside char array
// if char is emoji, remove it
// endfor
// return newstring
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激
“如何使用 javascript 检测表情符号”问题的最佳答案Extended_Pictographic
使用.
Emoji_Presentation
David Walsh在这篇博文中提到了。
我发现了这种使用Unicode 属性转义使用不使用“巨大魔法范围”的正则表达式来检测表情符号的很棒的方法:
console.log(/\p{Emoji}/u.test('flowers ')) // true
console.log(/\p{Emoji}/u.test('flowers')) // false
Run Code Online (Sandbox Code Playgroud)
但是当我在这个答案中分享这些知识时,@Bronzdragon 注意到它\p{Emoji}
也匹配数字!这是为什么?数字不是表情符号?
console.log(/\p{Emoji}/u.test('flowers 123')) // unexpectdly true
// regex-only workaround by @Bonzdragon
const regex = /(?=\p{Emoji})(?!\p{Number})/u;
console.log(
regex.test('flowers'), // false, as expected
regex.test('flowers 123'), // false, as expected
regex.test('flowers 123 '), // true, as expected
regex.test('flowers '), // true, as expected
)
// more readable workaround
const hasEmoji = str => {
const nbEmojiOrNumber = (str.match(/\p{Emoji}/gu) || []).length;
const nbNumber = (str.match(/\p{Number}/gu) || …
Run Code Online (Sandbox Code Playgroud)我有一个 1B 行的聊天消息表,其中有一个用于原始消息文本的最大大小的 VARCHAR 列。我如何 -
我正在使用以下函数替换字符串中的表情符号并且效果很好:
function doEmoji(s){
var ranges = [
'\ud83c[\udf00-\udfff]', // U+1F300 to U+1F3FF
'\ud83d[\udc00-\ude4f]', // U+1F400 to U+1F64F
'\ud83d[\ude80-\udeff]' // U+1F680 to U+1F6FF
];
var x = s.toString(16).replace(new RegExp(ranges.join('|'), 'g'),' whatever ');
return x;
};
Run Code Online (Sandbox Code Playgroud)
现在我想检查该字符串是否仅包含表情符号或空格字符。我之所以要这样做是因为我只想在不存在其他字符(空格除外)的情况下才替换表情符号。
一些例子:
Hello how are you? //do nothing
?? // replace emojis
?? // replace emojis
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个简单的解决方案,也许是一个正则表达式。谢谢
我有点问题
我正在使用NodeJS作为后端。现在,用户拥有一个“传记”字段,用户可以在其中写一些关于他自己的东西。
假设此字段的最大长度为220,并将其作为输入:
????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
如您所见,没有220个表情符号(有37个表情符号),但是如果我在nodejs服务器中这样做
console.log(bio.length)
Run Code Online (Sandbox Code Playgroud)
输入文本在何处,我得到221。如何“解析”字符串输入以获得正确的长度?关于Unicode是否有问题?
解决了
我使用了这个库:https : //github.com/orling/grapheme-splitter
我尝试过:
var Grapheme = require('grapheme-splitter');
var splitter = new Grapheme();
console.log(splitter.splitGraphemes(bio).length);
Run Code Online (Sandbox Code Playgroud)
长度为37。效果很好!
是的,我知道这是一些现有问题的重复。我已经在我的原始问题介绍中通过参考充分承认了这一点。
但是,在 2019 年,该列表扩展到包括额外的 230 个表情符号集,我认为现有答案/范围中没有涵盖这些表情符号。
http://www.unicode.org/Public/emoji/12.0/
我不完全熟悉也不习惯构建要删除的 unicode 范围,所以如果有人知道您可以发布更新版本吗?
根据我的理解,代码有点分散,不能在一个连续的范围内从头到尾轻松定义。
到目前为止,2018 年更新的最佳答案在这里:
text.replace(/([\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, '');
Run Code Online (Sandbox Code Playgroud)
如您所见,我还发布了关于更新列表的评论,但作者尚未更新答案。
其他类似问题: