来自 Java 的 Discord Webhook 消息中的表情符号和特殊字符不起作用

Posted

技术标签:

【中文标题】来自 Java 的 Discord Webhook 消息中的表情符号和特殊字符不起作用【英文标题】:Emojis and special characters in Discord webhook message from Java not working 【发布时间】:2021-10-06 09:18:18 【问题描述】:

所以我基本上想要完成的是我想从一个频道复制用户的消息,并使用 Webhook,我想完全按照他们在另一个频道中输入的方式重写它。问题是表情符号以“?”的形式出现,许多特殊字符(例如 £、é 等)完全破坏了它。

我的代码如下所示:

package uniqueimpact.discordbot;

import java.io.IOException;

import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

public class MessageEvent extends ListenerAdapter 
    private static final String WEBHOOK = "webhook-url";

    public void onGuildMessageReceived(GuildMessageReceivedEvent event) 
        if (!event.getAuthor().isBot()) 
            String messageSent = event.getMessage().getContentRaw();
            String formattedMessage = "";
            for (int i = 0; i < messageSent.length(); i++) 
                char character = messageSent.charAt(i);
                switch (character) 
                    case '\\':
                        formattedMessage += "\\\\";
                        break;
                    case '\"':
                        formattedMessage += "\\\"";
                        break;
                    case '\n':
                        formattedMessage += "\\n";
                        break;
                    default:
                        formattedMessage += character;
                
            

            String webhook = WEBHOOK;
            DiscordWebhook disWebhook = new DiscordWebhook(webhook);
            disWebhook.setContent(formattedMessage);

            try 
                disWebhook.execute();
             catch (IOException e) 
                e.printStackTrace();
            
        
    

此代码只是侦听消息,然后对其进行格式化以转义反斜杠、引号和换行符,然后使用 this code which I copied 将消息发送到 Webhook。

我知道表情符号和这些特殊字符是扩展的 Unicode 字符集的一部分,但我不确定如何处理这些信息。因此,如果有人知道我该如何解决这个问题,那将不胜感激。 :)

【问题讨论】:

【参考方案1】:

我不确定你是否需要转义你的特殊字符,但除此之外(实际上,我的第一次尝试只是按原样发送接收到的字符串而不做任何修改)。一种更简单的解决方案是将您的字符串转换为 unicode 序列 '\U****'。在这种情况下,您的所有符号(包括表情符号)都应该顺利通过。有一个开源 java 库 MgntUtils 有一个实用程序,可以将字符串转换为 unicode 序列,反之亦然:

result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

这段代码的输出是:

\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World

该库可以在Maven Central 或Github 找到它作为 maven 工件并带有源代码和 javadoc

这是StringUnicodeEncoderDecoder类的javadoc

因此,我建议您接收传入的消息并将其转换为 Unicode 序列并发送过来。接收方应该已经将其显示为符号。顺便说一句,相同的工具可以帮助您诊断问题。您可以查看收到的内容并将其解码回字符串。

免责声明:库是我写的

【讨论】:

以上是关于来自 Java 的 Discord Webhook 消息中的表情符号和特殊字符不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Python discord Bot 处理来自一个用户的消息并在 webhook 中发送它们

discord.py,使用 webhook 在所有通道中发送消息

如何从 Discord (webhook) 上的嵌入消息中读取特定文本

JSON & Discord 的 WebHook

如何使用嵌入 webhook 的 discord.py 修复此错误

在 CMD 中使用 Curl 发送 Discord webhook