【问题标题】:JSoup seems to ignore character codes?JSoup 似乎忽略了字符代码?
【发布时间】:2016-06-25 22:49:54
【问题描述】:

我正在用 Java 构建一个类似 CMS 的小型应用程序,它需要一个带有衬衫名称/描述的 .txt 文件,并将名称/描述加载到 customShirts 的 ArrayList 中(我制作的小类)。然后,它遍历 ArrayList,并使用 JSoup 解析模板 (template.html) 并将衬衫的独特细节插入 HTML。最后,它将每件衬衫抽出到一个输出文件夹中的自己的 HTML 文件中。

当描述加载到 customShirts 的 ArrayList 中时,我将所有特殊字符替换为适当的字符代码,以便它们可以正确显示(例如,将撇号替换为 ')。问题是,我注意到 JSoup 似乎会自动将字符代码转换为实际字符,这是一个问题,因为我需要输出可显示(这需要字符代码)。我能做些什么来解决这个问题吗?我查看了其他解决方法,例如:Jsoup unescapes special characters,但它们似乎需要在使用 replaceAll 插入之前解析文件,并且我使用 JSoup 插入字符代码敏感文本,这似乎并没有使它成为一个选项.

下面是我制作的 HTML 生成器的代码:

public void generateShirtHTML(){

    for(int i = 0; i < arrShirts.size(); i++){

        File input = new File("html/template/template.html");
        Document doc = null;
        try {
            doc = Jsoup.parse(input, "UTF-8", "");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }

        Element title = doc.select("title").first();
        title.append(arrShirts.get(i).nameToCapitalized());

        Element headingTitle = doc.select("h1#headingTitle").first();
        headingTitle.html(arrShirts.get(i).nameToCapitalized());

        Element shirtDisplay = doc.select("p#alt1").first();
        shirtDisplay.html(arrShirts.get(i).name);

        Element descriptionBox = doc.select("div#descriptionbox p").first();
        descriptionBox.html(arrShirts.get(i).desc);
        System.out.println(arrShirts.get(i).desc);

        PrintWriter output;
        try {
            output = new PrintWriter("html/output/" + arrShirts.get(i).URL);
            output.println(doc.outerHtml());
            //System.out.println(doc.outerHtml());
            output.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("Shirt " + i + " HTML generated!");

    }

}

提前致谢!

【问题讨论】:

  • 检查this;你可以试试doc.outputSettings().escapeMode(Entities.EscapeMode.extended);。如果这不起作用,您可以在从 Jsoup 获取 HTML 后尝试转义它,请参阅Recommended method for escaping HTML in Java(我读到这就是您想要做的,对吗?即。在输出中用&amp;quot; 替换引号之类的东西? )。另外 - 您可能想研究像 Thymeleaf 这样的模板引擎,对于这种情况,这将是比 Jsoup 更合适的选择。
  • 非常感谢,我添加了 Document.OutputSettings settings = doc.outputSettings(); settings.prettyPrint(false); settings.escapeMode(Entities.EscapeMode.extended); settings.charset("ASCII");它奏效了!谢谢!
  • @JonasCz 请将您的评论转化为答案,并让 OP 发送您反对的代表。下次,不要害羞地发布答案!评论不是答案的地方。
  • @Stephan ,感谢您的鼓励 :-) 我没有将其发布为答案,因为我不知道我的想法是否能解决问题,而且我认为它不是真的完成(我也不完全确定这是 OP 想要的)。但我已将其扩展为答案。而且,还有一件事:我不反对您接受我的评论并将其转化为答案(无论如何,我不太关心代表..),对我来说发表评论似乎很奇怪不完整或不打算回答问题并将其作为答案发布:-)

标签: java html regex arraylist jsoup


【解决方案1】:

扩展一点我的评论(因为斯蒂芬鼓励我..),你可以使用

doc.outputSettings().escapeMode(Entities.EscapeMode.extended);

告诉 Jsoup 在输出中转义/编码特殊字符,例如。左双引号 () 为 &amp;ldquo;。要让 Jsoup 编码 all 特殊字符,您可能还需要添加

doc.outputSettings().charset("ASCII");

为了确保所有 Unicode 特殊字符都会被 HTML 编码。

对于必须将数据填充到 HTML 文件中的大型项目,您可以考虑使用模板引擎,例如 Thymeleaf - 它更容易用于此类工作(更少的代码等),并且它提供更多专门用于此过程的功能。对于小型项目(如您的),Jsoup 很好(我过去曾这样使用过),但对于较大(甚至小型)的项目,您需要研究一些更专业的工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2016-09-30
    • 2016-03-16
    相关资源
    最近更新 更多