2015-01-19 6 views
5

У меня есть текстовый ввод с мобильного устройства. Он содержит эможи. В C#, у меня есть текст, какКак удалить символы emoji из строки?

Text text 

Проще говоря, я хочу, чтобы выходной текст будет

Text text 

Я пытаюсь просто удалить все такие смайликов из текста с rejex .. за исключением, я не уверен, как преобразовать этот emoji в его последовательность unicode. Как это сделать?

редактировать:

Я пытаюсь сохранить пользовательский ввод в MySQL. Похоже, что mysql UTF8 действительно не поддерживает символы Unicode и right way to do it would be by changing the schema, но я не думаю, что это вариант для меня. Поэтому я пытаюсь просто удалить все символы emoji, прежде чем сохранять его в базе данных.

Это моя схема для соответствующего столбца:

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

+0

Непонятно, чего вы пытаетесь достичь - что бы вы сделали со строковым значением после замены символов? –

+0

@JonSkeet отредактировал сообщение, спасибо. – LocustHorde

+0

UTF-8 действительно * должен быть в порядке. Можете ли вы опубликовать информацию о том, как вы пытаетесь сохранить данные вместе со своей информацией о схеме? –

ответ

23

Предполагая, что вы просто хочет, чтобы удалить все символы, не 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» является категорией Юникод для «суррогатной».

Похоже, что Regex работает на основе кодовых блоков UTF-16, а не в кодах Unicode, иначе вам нужен другой подход.

Обратите внимание, что существуют символы не BMP, кроме emoji, но я подозреваю, что вы обнаружите, что у них будет такая же проблема, когда вы попытаетесь их сохранить.

+0

Привет, я поставил вопрос, чтобы описать то, что, по моему мнению, было моей проблемой .. но я опробовал ваш ответ, и, оказывается, мне на самом деле не нужно их преобразовывать. Поэтому я сейчас редактировал вопрос! http://i.imgur.com/NoQfxud.png Спасибо! – LocustHorde

+0

@ LocustHorde: До тех пор, пока вы знаете, что вы просто отбрасываете бит ввода пользователя ... –

+0

Да! это временное решение (надеюсь, на короткий срок!) – LocustHorde

Смежные вопросы