Perl,JSON和Discord表情符号

时间:2018-05-21 01:42:36

标签: json perl discord

我有一个非常简单的DiscordBOT做一些管理任务。 其中一个功能是(或应该是)我们的“emoji based polls”。我们发了一个帖子,emojis列出了完整的选项,箭头指向评论下面的右边“反应”。

这个想法是让机器人(按命令)复制给帖子的给定反应,以便管理员可以删除他/她的反应,并实际上对他们想要投票的选项做出反应。 / p>

一切正常......直到错误:

 {"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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

U + d83d和U + de0f是等同于字符U + 1F60F的高和低代理对。在UTF-16编码中使用代理对来编码高于U + FFFF的代码点。将代理项对转换为代码点的公式是

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

所有数字均为十六进制。

有关详细信息,请参阅The Surrogate Pair Calculator

这应该由您的编码/解码库完成。