You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDA中getAsReactionCode()无法返回Unicode表情符号的问题求助

问题:Discord机器人表情反应获取Unicode值异常

我正在开发一款Discord机器人,需求是当消息被添加特定表情反应时,机器人发送差异化消息。但调用getReaction().getEmoji().getAsReactionCode()方法无法返回表情对应的Unicode值,用System.out.println输出只显示“?”(调试器显示未知符号),代码如下:

public class EmoteReactControler extends ListenerAdapter {
    @Override
    public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event){
        String reaction = event.getReaction().getEmoji().getAsReactionCode();
        User userReacted = event.getUser();
        Channel channel = event.getChannel();
        String channelMention = channel.getAsMention();
        String jumpLink = event.getJumpUrl();
        String answer = "nothing";
        System.out.println(reaction);
        if ( reaction.equals("U+1F600")) {
            answer = "one";
        } else if (reaction.equals("U+1F601")) {
            answer = "two";
        } else if (reaction.equals("U+1F60D")) {
            answer = "three";
        } else if (reaction.equals("U+1F62D")){
            answer = "four";
        }

        String message = userReacted.getName() + " did " + answer + " see here: " + jumpLink + " in " + channelMention;
        event.getGuild().getTextChannelById(channel.getId()).sendMessage(message).queue();
    }
}

解决方案

核心问题

getAsReactionCode()返回的是实际的表情字符(UTF-16编码),而非U+1F600这种格式的字符串,你的判断逻辑完全错误。另外控制台显示“?”是因为控制台环境不支持Emoji渲染,不影响代码逻辑判断。

修改步骤

  1. 直接用表情字符或UTF-16转义序列比较
    原生Unicode表情可以直接复制到代码中,或者用对应的UTF-16转义字符串(比如😀对应"\uD83D\uDE00")。
  2. 区分原生表情和自定义服务器表情
    如果是服务器自定义表情,getAsReactionCode()返回的是<:name:id>格式,需要单独判断。

修改后代码

public class EmoteReactControler extends ListenerAdapter {
    @Override
    public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event){
        MessageReaction.ReactionEmoji emoji = event.getReaction().getEmoji();
        User userReacted = event.getUser();
        Channel channel = event.getChannel();
        String channelMention = channel.getAsMention();
        String jumpLink = event.getJumpUrl();
        String answer = "nothing";

        // 处理原生Unicode表情
        if (emoji.isUnicode()) {
            String reaction = emoji.getAsReactionCode();
            // 控制台显示?不影响判断,只要比较逻辑正确即可
            if (reaction.equals("😀")) { // 直接用表情字符
                answer = "one";
            } else if (reaction.equals("😁")) {
                answer = "two";
            } else if (reaction.equals("😍")) {
                answer = "three";
            } else if (reaction.equals("😭")){
                answer = "four";
            }
            // 也可以用UTF-16转义序列:
            // else if (reaction.equals("\uD83D\uDE2D")) { answer = "four"; }
        }
        // 可选:处理自定义服务器表情
        else if (emoji.isCustom()) {
            Emote customEmote = emoji.getEmote();
            // 根据自定义表情的ID或名称判断
            if (customEmote.getName().equals("myCustomEmote")) {
                answer = "custom emote action";
            }
        }

        String message = userReacted.getName() + " did " + answer + " see here: " + jumpLink + " in " + channelMention;
        event.getGuild().getTextChannelById(channel.getId()).sendMessage(message).queue();
    }
}

补充说明

  • 控制台显示“?”是因为大多数默认控制台不支持Emoji字符渲染,你可以用IDE的调试器查看reaction变量的实际值,会显示正确的表情或UTF-16编码。
  • 确保你的项目文件编码是UTF-8,避免表情字符乱码。

内容的提问来源于stack exchange,提问作者Claradcl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:58:22