来自 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 序列并发送。接收方应该已经将其显示为符号。顺便说一句,同样的工具可以帮助您诊断问题。您可以看到收到的内容并将其解码回字符串。
免责声明:库是我写的
所以我基本上想要完成的是我想从一个频道复制用户的消息,并使用 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 序列并发送。接收方应该已经将其显示为符号。顺便说一句,同样的工具可以帮助您诊断问题。您可以看到收到的内容并将其解码回字符串。
免责声明:库是我写的