Почему С# не читает человеческие смайлики?

У меня есть телеграмм-бот, сделанный на C#, и я добавил команду, которая читает смайлик, а затем отправляет его обратно. Он хорошо работает с большинством смайликов, за исключением человеческих, которые могут иметь несколько оттенков кожи. Тем не менее, я сохранил цвет кожи по умолчанию, но он все равно не работает. Любые идеи?

Обновлено: я неправильно объяснил. Вы отправляете эмодзи, программа сравнивает его константой с эмодзи, и отправляет обратно, если совпадает. После некоторого тестирования я обнаружил, что проблема связана с полом. Гендерные смайлики не работают, так как строка, с которой я их сравниваю, кажется неверной. Я пытался использовать «эмодзи» + «мужской символ смайликов», но все равно не работает.

С# все равно, это язык программирования. Ошибка в самой реализации, а не в используемом языке. Тем не менее, это слишком широкий ответ, поскольку никаких подробностей не приводится.

Spencer Wieczorek 22.02.2019 17:03

Большинство эмодзи представляют собой одиночные кодовые точки Unicode, но цвет кожи определяется с помощью модификаторов, которые обрабатываются как отдельные символы. Таким образом, человеческий смайлик с оттенком кожи состоит из двух символов: один для смайлика, а другой для модификатора тона кожи. en.wikipedia.org/wiki/Combining_character

Paul Johnson 22.02.2019 17:05

Похоже, ваш метод кодирования неверен.

jdweng 22.02.2019 17:14

Я неправильно объяснил. Вы отправляете эмодзи, программа сравнивает его константой с эмодзи, и отправляет обратно, если совпадает. После некоторого тестирования я обнаружил, что проблема связана с полом. Гендерные смайлики не работают, так как строка, с которой я их сравниваю, кажется неверной. Я пытался использовать «эмодзи» + «мужской символ смайликов», но все равно не работает.

Jaime Fernández 22.02.2019 17:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
230
1

Ответы 1

Строки в .NET framework хранятся с использованием кодировки UTF-16, которая использует два байта для большинства символов, но для остальных. Кроме того, некоторые глифы, в том числе эмодзи, состоят из нескольких символов. Правила Unicode для обработки составных символов достаточно сложны и достаточно изменились за прошедшие годы, поэтому старый код обработки текста часто будет иметь проблемы с обработкой некоторых форм составных символов.

Проблема в том, что на каком-то уровне для отображения строки потребуется разбить ее на части, которые можно отображать отдельно. Если системная функция «отображать строку в одной строке» понимает текущие правила для эмодзи, а функция приложения «отображать строку в рамке с переносом слов» — нет, эта функция может случайно разделить входную строку между частями составной персонаж и попросить систему отрисовать каждую часть отдельно; результат - настоящий бардак.

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

Другие вопросы по теме