如何从字符串中删除表情符号字符?
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 类别了吗?最好用一个完整的例子来问一个新问题,而不是“其中一个或两个”(让我们猜测哪个)。然后我们可以更轻松地查看正在发生的事情。以上是关于如何从字符串中删除表情符号字符?的主要内容,如果未能解决你的问题,请参考以下文章