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渲染,不影响代码逻辑判断。
修改步骤
- 直接用表情字符或UTF-16转义序列比较
原生Unicode表情可以直接复制到代码中,或者用对应的UTF-16转义字符串(比如😀对应"\uD83D\uDE00")。 - 区分原生表情和自定义服务器表情
如果是服务器自定义表情,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
相关产品推荐
相关产品推荐

