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

时间:2015-01-19 11:31:52

标签: c# mysql unicode emoji

我从移动设备获得了文字输入。它包含表情符号。在C#中,我将文本作为

Text  text

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

Text text

我试图用rejex从文本中删除所有这样的表情符号..除了,我不知道如何将表情符号转换为它的unicode序列.. 我怎么做?

编辑:

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

这是相关专栏的架构:

enter image description here

我使用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

此外,我试图将其转换为编码字节,但它确实无法正常工作..

enter image description here

1 个答案:

答案 0 :(得分:32)

假设您只想删除所有非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, @"\p{Cs}", "");
        Console.WriteLine(result); // 2
    }
}

这里" Cs"是"代理"。

的Unicode类别

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

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