无法解码 Java UTF8

Unable to decode Java UTF8

提问人:user273121 提问时间:6/20/2023 最后编辑:skomisauser273121 更新时间:6/21/2023 访问量:65

问:

我对 Java 程序的输入是 years ネン 日语字符串的字符代码。我需要把它转换回日语。 我尝试了getBytes(UTF8),但无法成功将其转换回日语。你能帮忙吗

我尝试了getBytes(UTF8)。

我的输入是对应于日文字符“年ネン”。年 ネン

Java UTF-8 解码 编码

评论

0赞 user273121 6/20/2023
我的输入是年ネン
4赞 Ralf Kleberhoff 6/20/2023
在看到预期结果之前,涉及许多步骤,每个步骤都可以对您的问题发挥作用。请给我们看一个小的、完整的代码示例,我们可以在我们的计算机上编译和运行。另外,您是否在 IDE、Windows CMD 窗口或在哪里运行?这一点也很重要。
0赞 JosefZ 6/20/2023
这回答了你的问题吗?如何在 Java 中取消转义 HTML 字符实体?
0赞 g00se 6/21/2023
到目前为止,您尝试过什么?
0赞 skomisa 6/21/2023
@Josefz 您提议的副本是针对字符实体的(如其标题中明确说明的那样),但这个问题是关于未转义的数字实体。

答:

0赞 skomisa 6/21/2023 #1

我不知道有任何 JDK 方法可以解决您的问题,但您可以使用 Apache 的 StringEscapeUtils.unescapeHtml4() 方法在一行中完成,而且代码很简单。下面是使用示例数据的示例:

import org.apache.commons.text.StringEscapeUtils;

public class Main {

    public static void main(String[] args) throws Exception {
        String input = "年 ネン";
        System.out.println("input=[" + input + "]");
        String output = StringEscapeUtils.unescapeHtml4(input);
        System.out.println("output=[" + output + "]");
    }
}

输出如下:

input=[年 ネン]
output=[年 ネン]

我在 Intellij IDEA 中使用 JDK 20 运行代码。

另一种纯 Java 方法是自己编写代码(但何必呢?

笔记:

  • javadoc for 没有明确声明它支持您指定格式的数字实体,但它似乎工作正常。unescapeHtml4()
  • 该类可以在 和 中找到。请务必使用实现。StringEscapeUtilsorg.apache.commons.textorg.apache.commons.langorg.apache.commons.text
  • 您需要下载 Apache Commons 文本库并将其添加到您的项目中,然后导入您的代码。org.apache.commons.text.StringEscapeUtils;
  • 您还需要下载 Apache Commons Lang 库并将其添加到您的项目中。否则,您将在运行时得到一个。java.lang.ClassNotFoundException: org.apache.commons.lang3.Range
  • 输入中的任何空格都将保留在输出中。unescapeHtml4()
1赞 g00se 6/21/2023 #2

正如@skomisa所说,为此使用一个合适的库可能更好,但如果你想要一些快速和肮脏的东西,那么:

import java.util.Arrays;

public class DecimalEntityDecoder {
    public static void main(String[] args) {
        try {
            String decimalEntities = args[0];
            String output = Arrays.stream(decimalEntities.replaceAll("\\s+", "").split(";")).
                map(s ->s.replaceAll("\\D", "")).
                mapToInt(Integer::valueOf).
                collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).
                toString();
            System.out.println(output);
        }
        catch(Throwable t) {
            t.printStackTrace();
        }
    }
}

评论

0赞 skomisa 6/21/2023
这很好用,我现在认为你的快速和肮脏的方法可能比使用库更好。OP 中的示例数据是干净的,但如果输入有问题,完全控制过程是件好事。