Сравнение гендерных смайликов в UTF-16 - PullRequest
0 голосов
/ 22 февраля 2019

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

Проблема возникает с смайликами разных жанров.Например, смайлик полицейского не обнаруживается.Я попытался сравнить строку с «?‍», но она не была обнаружена.Я попытался добавить мужской символ и сравнить строку с «?‍♂️♂️», но это тоже не сработало.

Пример фрагмента моего кода:

                case "?":
                case "?":
                    Send(args[1] + " 70%", update.Message.Chat.Id);
                    break;
                case "?":
                case "?":
                case "?":
                case "?":
                    Send(args[1] + " 40%", update.Message.Chat.Id);
                    break;

Все они работают, кроме ? и ?, которые принадлежат к разным полам.

Не уверен, что это важно, но язык - C #, и я программирую в Visual Studio, что позволяет мне копировать ивставьте туда смайлики.

Что я делаю не так?

1 Ответ

0 голосов
/ 23 февраля 2019

Я пытался сравнить строку с "?‍", но она не была обнаружена.

Этот смайлик из полиции выше состоит из двух символов Unicode, лучше называемых Codepoints:офицер полиции U + 1F46E и модификатор персонажа U + 200D (комбинация из 4 точек выше).Если в выписке по делу у вас есть только сотрудник полиции U + 1F46E, то он не будет найден.

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

В исходном коде я поместил бы ?‍ в качестве комментария, а в строке описания дела сотрудник полиции, использующий экранирование Codepoint "\ U0001F46E ".

case "\U0001F46E":        // ?‍
case "\U0001F46E\u200D":  // ?‍ + ....

Или

const string PoliceOfficer = "\U0001F46E" // ?‍
...
case PoliceOfficer: 

Обратите внимание на различное экранирование: верхний \ U для 8 шестнадцатеричных цифр и нижний \ u для 4 шестнадцатеричных цифр.Затем, когда вы не распознаете строку, просто распечатайте ее (в конце концов, в отладчике), получите правильное экранирование, которое строит вашу строку, и добавьте ее в операторы case.

В качестве альтернативы вы можете сначала удалитьиз входной строки все объединяющие метки, например "\ u200D", а затем передайте его в оператор case.А потом, в конце концов, придать дополнительный смысл комбинирующему персонажу.

...