如何从字符串中删除表情符号字符?

Posted

技术标签:

【中文标题】如何从字符串中删除表情符号字符?【英文标题】:How do I remove emoji characters from a string? 【发布时间】:2015-03-17 09:39:46 【问题描述】:

我有一个来自移动设备的文本输入。它包含表情符号。在 C# 中,我将文本设为

Text ???????? text

简单地说,我希望输出文本是

Text text

我正在尝试使用 rejex 从文本中删除所有此类表情符号.. 除了,我不确定如何将该表情符号转换为它的 unicode 序列.. 我怎么做?

编辑:

我正在尝试将用户输入保存到 mysql 中。看起来 mysql UTF8 并不真正支持 unicode 字符和 right way to do it would be by changing the schema,但我认为这不是我的选择。所以我试图在将其保存到数据库之前删除所有表情符号字符。

这是我的相关列的架构:

我使用 Nhibernate 作为我的 ORM,生成的插入查询如下所示:

Insert into `Content` (ContentTypeId, Comments, DateCreated) 
values (?p0, ?p1, ?p2);
?p0 = 4 [Type: Int32 (0)]. ?p1 = 'Text ???????? text' [Type: String (20)], ?p2 = 19/01/2015 10:38:23 [Type: DateTime (0)]

当我从日志中复制此查询并直接在 mysql 上运行时,我收到此错误:

1 warning(s): 1366 Incorrect string value: '\xF0\x9F\x98\x80 t...' for column 'Comments' at row 1   0.000 sec

另外,我尝试将其转换为编码字节,但它并没有真正起作用..

【问题讨论】:

不太清楚您要实现什么 - 替换字符后您将如何处理字符串值? 见这里:gist.github.com/adamlwatson/9623703 @LocustHorde 您在哪个版本的 MySQL 上运行?似乎字符集 utf8mb4 应该使所有内容都成为 tikitiboo...在这里阅读答案***.com/questions/24253985/…“似乎 MySQL 支持两种形式的 unicode ucs2,即每个字符 16 位和 utf8 每个字符最多 3 个字节。坏消息是这两种形式都不支持需要 17 位的平面 1 字符。(主要是表情符号)。看起来 MySQL 5.5.3 及更高版本也支持 utf8mb4、utf16 和 utf32 以及补充字符(阅读表情符号)" 来自***.com/questions/10992921/… 的一些注意事项 "但是,请注意,基本多语言平面中还有其他字符被手机用作表情符号,但早于表情符号。例如 U+2665 是传统的 Heart Suit 字符 ♥,但在某些设备上可能会呈现为表情符号图形。您是否将其视为表情符号并尝试将其删除取决于您。" Octopoid 的要点不会转换它们,它会删除它们。如果您只想删除不在 BMP 中的任何字符,这相当容易。 【参考方案1】:

假设您只想删除所有非 BMP 字符,即 Unicode 代码点为 U+10000 或更高的任何字符,您可以使用正则表达式删除任何 UTF-16 代理 代码单元从字符串。例如:

using System;
using System.Text.RegularExpressions;

class Test

    static void Main(string[] args)
    
        string text = "x\U0001F310y";
        Console.WriteLine(text.Length); // 4
        string result = Regex.Replace(text, @"\pCs", "");
        Console.WriteLine(result); // 2
    

这里的“Cs”是“代理”的 Unicode 类别。

Regex 似乎基于 UTF-16 代码单元而不是 Unicode 代码点工作,否则您需要一种不同的方法。

请注意,除了表情符号之外还有非 BMP 字符,但我怀疑您在尝试存储它们时会发现它们会遇到同样的问题。

【讨论】:

嗨,我提出这个问题是为了描述我认为是我的问题。但我尝试了你的答案,结果发现我实际上不需要转换它们。所以我编辑了现在提问! i.imgur.com/NoQfxud.png谢谢! @LocustHorde:只要你知道你只是在丢弃用户输入的一部分...... 是的!这是一个临时解决方案(希望是短期的!) 嗨@JonSkeet,我正在尝试使用您的正则表达式来检测字符串中是否包含表情符号(几乎完全相同的代码)。出于某种原因,\pCs 无法捕捉到所有表情符号。你知道这件事吗?我已经尝试了大约 30 个,但没有检测到一两个。我假设它们不在该正则表达式的范围内,但我希望得到您的专家意见,因为我对代理一无所知,对一般字符也知之甚少 @GilSand:嗯,你看过这些字符属于哪些 Unicode 类别了吗?最好用一个完整的例子来问一个新问题,而不是“其中一个或两个”(让我们猜测哪个)。然后我们可以更轻松地查看正在发生的事情。

以上是关于如何从字符串中删除表情符号字符?的主要内容,如果未能解决你的问题,请参考以下文章

python Python正则表达式从字符串中删除表情符号

使用扩展语法从包含表情符号的字符串中过滤空字符串

python python删除字符串中的表情符号

如何使用 javascript 删除表情符号代码?

从 Unicode 字符串中正确提取表情符号

如何使用python在字符串中查找和计算表情符号?