首先,我想提前感谢您的帮助。
我目前正在编写一个网络抓取工具,用于解析HTML内容,剥离HTML标记,然后拼写检查从解析中检索到的文本。
使用JSoup和Google拼写检查API,剥离HTML标记和拼写检查没有造成任何问题。
我能够从URL中下载内容并将此信息传递给byte [],然后最终传递给String,以便可以对其进行剥离和拼写检查。我遇到了字符编码问题。
例如,在解析http://www.testwareinc.com/ ...
时原文:我们扩展了移动网络和移动应用测试服务。
...页面根据元标记使用ISO-8859-1 ...
ISO-8859-1 Parse:我们扩展了移动网络和移动应用测试服务。
...然后尝试使用UTF-8 ......
UTF-8 Parse:我们扩展了移动网络和移动应用测试服务。
的问题 的 网页的HTML是否可能包含多种编码?怎么能被发现呢?
答案 0 :(得分:2)
看起来撇号被编码为0x92字节,根据Wikipedia,它是未分配的/私有代码点。
从那时起,看起来浏览器会假设它是一个非编码的1字节Unicode代码点而退回:+0092( Private Use Two )似乎代表了作为撇号。没有等待,如果它是一个字节,则更可能是cp1252:浏览器必须根据所宣传的CP具有回退策略,例如ISO-8859-1 - > CP1252。
因此,这里没有混合编码,但正如其他人所说的那样。但是后备启发式有时会有所帮助,有时候却没有。
如果您有足够的好奇心,可能需要深入了解FF或Chrome的源代码,以确切了解他们在这种情况下的行为。
答案 1 :(得分:1)
在文档中有多个编码不是混合文档,它是一个破碎的文档。
不幸的是,有很多网页使用的编码与文档定义不匹配,或者包含一些在给定编码中有效的数据和一些无效的内容。
没有好办法处理这个问题。可以尝试猜测文档的编码,但这很难并且不是100%可靠。在像您这样的情况下,最简单的解决方案就是忽略无法解码的文档部分。
答案 2 :(得分:0)
Apache Tika有一个编码检测器。如果您需要C ++中的某些东西并且能够花钱,那么也有商业选择。
我几乎可以保证每个网页都采用一个编码,但很容易被误认为是哪一个。
答案 3 :(得分:-2)
似乎与特殊字符有关。检查此StringEscapeUtils.escapeHtml是否有帮助。或任何方法
编辑:添加了这个逻辑,因为他无法使代码工作
public static void main(String[] args) throws FileNotFoundException {
String asd = "’";
System.out.println(StringEscapeUtils.escapeXml(asd)); //output - ’
System.out.println(StringEscapeUtils.escapeHtml(asd)); //output - ’
}