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

Emojis and special characters in Discord webhook message from Java not working

所以我基本上想要完成的是我想从一个频道复制用户的消息,并使用 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 字符集的一部分,但我不确定如何处理这些信息。因此,如果有人知道我该如何解决此问题,将不胜感激。 :)

我不确定您是否需要对特殊字符进行转义,但这不是重点(实际上,我的第一次尝试只是按原样发送接收到的字符串而不进行任何修改)。一种更简单的解决方案是将您的字符串转换为 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 or at Github 找到它作为 maven 工件和来源以及 javadoc

这是 javaclassStringUnicodeEncoderDecoder

的文档

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

免责声明:库是我写的