json - 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
解决方案
您没有展示如何解析包含这些序列的 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
推荐阅读
- python - 我可以 git 忽略整个分支以创建与实时服务器接口的本地分支,并将调试设置为 True。?
- grep - 只能指定一种类型的列表?
- python - 如何将 Pandas 数据框转换为二维数组
- java - JavaFx:如何在 listView 中显示和隐藏滚动条?
- python - VSCode conda 激活基地给出 CommandNotFoundError
- css - 当我链接引导程序时更改所有 css 样式
- camunda - Camunda Modeler 决策表:我们可以从外部端点获取字符串输入的预定义值(InputValues)吗?
- angular - 关于 Angular 中的控制值访问器,最常见的不良做法是什么?
- azure - Azure Application Insights 失败 IN 筛选器的语法
- google-cloud-platform - 使用 Google Cloud Functions 流式插入/更新