我有一个非常简单的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
答案 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。
这应该由您的编码/解码库完成。