在 java 中存储和解析 HTML 时出现特殊字符和符号问题

Issues with special characters and symbols while storing and parsing HTML in java

我正在使用 Selenium 测试电子商务应用程序。我需要检查在列表页面上选择类别时列出的项目是否与数据库中的项目匹配。所以我正在使用 selenium 访问页面并将页面源存储在文本文件中。我后来使用 HTMLCleaner 和 JSoup 解析这个文本文件来获取我希望用数据库验证的字段。

但是,我注意到页面上列出的某些产品使用了特殊字符,例如 ™ 、® 等,这些字符 stored/retrieved 不正确并显示为问号。

我用来存储页面源的代码:

BufferedWriter writer = null;
try
{
    writer = new BufferedWriter(new FileWriter(filepath+"/"+filename+".txt"));
    writer.write(driver.getPageSource());
}
catch ( IOException e)
{
    e.printStackTrace();
}
finally
{
    try
    {
        writer.close( );
    }
    catch (IOException e)
    {
    }
}

正在检索和解析文件

Document htmlFile = Jsoup.parse(fileSavedPreviously,"ISO-8859-1");
TagNode tagNode = new HtmlCleaner().clean(fileSavedPreviously);

try {
    org.w3c.dom.Document doc = new DomSerializer(new CleanerProperties())
        .createDOM(tagNode);

} catch (ParserConfigurationException e) {
    e.printStackTrace();
}

//rest of the parsing....

定义流编写器的编码:

writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fullpath), "UTF-8"));

并向解析器提供相同的一个:

Document htmlFile = Jsoup.parse(fileSavedPreviously, "UTF-8");

要获取页面的编码,请在浏览器控制台中执行document.inputEncoding

如果你使用 FileWriter 的构造函数,它会使用默认的字符集,如果你遇到这样的问题,显然不包括那些特殊字符,所以你应该使用 OutputStreamWriter 的构造函数来明确定义字符编码如下:

writer = new BufferedWriter(
    new OutputStreamWriter(
        new FileOutputStream(String.format("%s/%s.txt", filepath, filename)), charsetName
    )
);

由于 ISO-8859-1 涵盖 ® 而不是 ™,您应该使用 unicode 字符集,例如 UTF-8 并在您编写内容和阅读内容的地方都设置它。