Perl, JSON и Discord Emoji - PullRequest
       6

Perl, JSON и Discord Emoji

0 голосов
/ 21 мая 2018

Я очень просто DiscordBOT выполняю некоторые административные задачи.Одной из особенностей является (или должна быть) наша "emoji based polls".Мы создаем сообщение, в котором смайлики перечисляют варианты с полными стрелками, указывающими вниз на «реакцию» справа под комментарием.

Идея состояла в том, чтобы заставить бота (по команде) дублировать данную реакцию на сообщение,так что администратор может удалить его / ее реакции, и фактически шлепнуть реакцию на вариант, за который они хотели бы проголосовать заранее.

Все работает нормально ... до ошибки:

 {"code": 10014, "message": "Unknown Emoji"}

Скрипт perl, с помощью LWP, читает реакции из тестового поста как "\ud83d\ude0f", но возвращать их "как есть" просто не работает.

Помещение той же реакции, что и "\x{1F60F}", работает отлично!(источник: https://codepoints.net/U+1F60F?lang=en)

Я не возражаю, кроме как ... как мне конвертировать все эти \u-based emojis to \x-based ones? =P После некоторого поиска в Google и проб и ошибок я пробовалтакие как "decode_json / encode_json" и т. д., но я не могу заставить его работать.Я думаю, что я должен пропустить что-то маленькое и "очевидное" ...

Спасибо за любую помощь!

Также откройте для других идей "нестандартно", если они решат проблему!= Р * * тысяча двадцать пять

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

U + d83d и U + de0f - суррогатная пара высокого и низкого уровня, приравненная к символу U + 1F60F.Суррогатные пары используются в кодировках UTF-16 для кодирования кодовых точек выше, чем U + FFFF.Формула для преобразования суррогатной пары в кодовую точку:

<code point> = (<high surrogate> - D800) * 400 + (<low surrogate> - DC00) + 10000

Все числа указаны в шестнадцатеричном формате.

См. Калькулятор суррогатной пары для получения дополнительной информации.

Это действительно должно быть сделано вашей библиотекой кодирования / декодирования.

0 голосов
/ 21 мая 2018

Вы не показываете, как анализируете JSON, который содержит эти последовательности, но какой бы анализатор JSON вы не использовали, он выглядит некорректно.Вместо этого используйте другой анализатор, такой как JSON :: XS .

use strict;
use warnings qw( all );
use feature qw( say );
use utf8;
use open ":std", ":encoding(UTF-8)";

use Encode   qw( encode_utf8 );
use JSON::XS qw( decode_json );

{
   # If you get decoded JSON.
   my $json_text = '{ "foo": "\ud83d\ude0f" }';
   my $data = JSON::XS->new->decode($json_text);
   say $data->{foo};
   say $data->{foo} eq "\x{1F60F}" ? "match" : "no match";
}

{
   # If you get JSON encoded using UTF-8.
   my $json_utf8 = encode_utf8('{ "foo": "\ud83d\ude0f" }');
   my $data = decode_json($json_utf8);
   say $data->{foo};
   say $data->{foo} eq "\x{1F60F}" ? "match" : "no match";
}

Вывод:

?
match
?
match
...