首页 > 解决方案 > Perl、JSON 和 Discord 表情符号

问题描述

我有一个非常简单的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 经过一些繁重的谷歌搜索和反复试验后,我尝试了诸如“decode_json/encode_json”等之类的东西,但我似乎无法让它起作用。我在想我必须错过一些小而“明显”的东西......

感谢您的帮助!

如果他们解决了问题,也可以接受其他“开箱即用”的想法!=P

标签: jsonperldiscord

解决方案


您没有展示如何解析包含这些序列的 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

推荐阅读