У меня есть телеграмм-бот, сделанный на C#, и я добавил команду, которая читает смайлик, а затем отправляет его обратно. Он хорошо работает с большинством смайликов, за исключением человеческих, которые могут иметь несколько оттенков кожи. Тем не менее, я сохранил цвет кожи по умолчанию, но он все равно не работает. Любые идеи?
Обновлено: я неправильно объяснил. Вы отправляете эмодзи, программа сравнивает его константой с эмодзи, и отправляет обратно, если совпадает. После некоторого тестирования я обнаружил, что проблема связана с полом. Гендерные смайлики не работают, так как строка, с которой я их сравниваю, кажется неверной. Я пытался использовать «эмодзи» + «мужской символ смайликов», но все равно не работает.
Большинство эмодзи представляют собой одиночные кодовые точки Unicode, но цвет кожи определяется с помощью модификаторов, которые обрабатываются как отдельные символы. Таким образом, человеческий смайлик с оттенком кожи состоит из двух символов: один для смайлика, а другой для модификатора тона кожи. en.wikipedia.org/wiki/Combining_character
Похоже, ваш метод кодирования неверен.
Я неправильно объяснил. Вы отправляете эмодзи, программа сравнивает его константой с эмодзи, и отправляет обратно, если совпадает. После некоторого тестирования я обнаружил, что проблема связана с полом. Гендерные смайлики не работают, так как строка, с которой я их сравниваю, кажется неверной. Я пытался использовать «эмодзи» + «мужской символ смайликов», но все равно не работает.





Строки в .NET framework хранятся с использованием кодировки UTF-16, которая использует два байта для большинства символов, но для остальных. Кроме того, некоторые глифы, в том числе эмодзи, состоят из нескольких символов. Правила Unicode для обработки составных символов достаточно сложны и достаточно изменились за прошедшие годы, поэтому старый код обработки текста часто будет иметь проблемы с обработкой некоторых форм составных символов.
Проблема в том, что на каком-то уровне для отображения строки потребуется разбить ее на части, которые можно отображать отдельно. Если системная функция «отображать строку в одной строке» понимает текущие правила для эмодзи, а функция приложения «отображать строку в рамке с переносом слов» — нет, эта функция может случайно разделить входную строку между частями составной персонаж и попросить систему отрисовать каждую часть отдельно; результат - настоящий бардак.
Скорее всего, ваша проблема связана не с C# как таковым, а с тем, что пытается отобразить сообщение. Обработка составных символов настолько сложна, что очень немногие приложения будут правильно обрабатывать все, что требуется в соответствии с текущими стандартами, и ни одно из сегодняшних приложений, вероятно, не будет правильно обрабатывать все, что требуется в следующей версии стандарта.
С# все равно, это язык программирования. Ошибка в самой реализации, а не в используемом языке. Тем не менее, это слишком широкий ответ, поскольку никаких подробностей не приводится.