2015-07-07 8 views
2

Я пытаюсь создать строку с emoji "", начиная с этой строки "D83DDC71". Для этого я пытаюсь преобразовать строку выше в эту строку "\uD83D\uDC71".конвертировать шестнадцатеричную строку в соответствующую строку emoji

Если я использую этот код он работает (текстовое поле показывает, как и ожидалось):

textbox.Text += "\uD83D\uDC71"; 

, но если я использую это не работает (текстовое поле показывает точный текст «\ uD83D \ uDC71» вместо одного символа):

textbox.Text += sender.Code.ToString("X").insert(4, @"\u").insert(0, @"\u"); 

Что такое правильный способ преобразовать шестнадцатеричное представление смайлик к соответствующему C# строки (UTF-16)?

+0

проблема заключается в том, что если я поместил в этот «\ uD83D \ uDC71» в текстовое поле, это сработает, но если я добавлю \ u к этой строке «D83DDC71», я получаю только строку, а не emoji. – frenk91

+0

В какое текстовое поле ? –

+0

стандартная одна из оконных телефонов – frenk91

ответ

3

У вас есть строка, содержащая два шорта в шестнадцатеричной форме, поэтому сначала вам нужно их разобрать. В моем примере используется overload of Convert.ToInt16, который также принимает целое число, определяющее базу целых чисел в строке, которая в нашем случае равна 16 (шестнадцатеричная).

string ParseUnicodeHex(string hex) 
{ 
    var sb = new StringBuilder(); 
    for (int i = 0; i < hex.Length; i+=4) 
    { 
     string temp = hex.Substring(i, 4); 
     char character = (char)Convert.ToInt16(temp, 16); 
     sb.Append(character); 
    } 
    return sb.ToString(); 
} 

Пожалуйста, обратите внимание, что этот метод не сработает, если длина строки не делится на 4.

Причина это работает:

textbox.Text += "\uD83D\uDC71"; 

происходит потому, что у вас есть строку литерал содержащий unicode character escape sequences. Когда вы компилируете свою программу, компилятор заменяет эти escape-последовательности правильными байтами юникода. Вот почему вы не можете просто добавить \u перед символами во время выполнения, чтобы заставить его работать.

+0

Это работает спасибо! – frenk91

+0

другое решение можно найти здесь: http: // stackoverflow.com/a/32895418/997940 –

4

Хорошо. Кажется, у вас есть строка, которая дает шестнадцатеричную сумму каждого из кодовых единиц UTF-16 символа U + 1F471 ().

Поскольку char представляет собой кодовый блок UTF-16, разделить строку на две кусков 4-символов, синтаксический анализ, что в Int как шестнадцатеричные, отлитый друг к char, а затем объединить их в строку:

var personWithBlondHair = "" 
    + (char)int.Parse("D83DDC71".Substring(0, 4), NumberStyles.HexNumber) 
    + (char)int.Parse("D83DDC71".Substring(4, 4), NumberStyles.HexNumber); 

согласно https://dotnetfiddle.net/oTgXfG

0

Попробуйте один

 string str = "D83DDC71"; 
     string emoji = string.Join("", (from Match m in Regex.Matches(str, @"\S{4}") 
      select (char) int.Parse(m.Value, NumberStyles.HexNumber)).ToArray()); 

Это Отделить ул 4 по 4 в массив строк. то он преобразует каждую строку в символ. Наконец, он присоединится ко всем символам в одну строку как эможи. все в одной строке.

+0

Какой '@" \ u "+ m.Value' должен был делать? –

+0

ex: 'm.Value' будет' 'D83D" '. то это будет '' \ uD83D "' @AlexeiLevenkov –

+0

Вы не видели вопрос? Что в основном «почему' '\ uD83D \ uDC71" 'создает emoji в то время как' @ "\ u" + "d83d" + @ "\" + "DC71" 'does not" ... Так что не уверен, как ваше сообщение отвечает на него , Кроме того, '\ d' не будет соответствовать буквам, но это менее интересно. –

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