首页 新闻 会员 周边

JTidy 解析 HTML 中文 乱码问题

0
悬赏园豆:50 [已解决问题] 解决于 2011-09-12 16:58

代码如下

其中responseString是通过HttpClient返回的HTML页面内容,包含中文,UTF-8,在log中显示正常;

这段代码在一个Web应用中被执行。

1, 当我直接在eclipse,把Web应用放tomcat里运行时,两次trace打印出来的内容都能正常显示中文内容;

2, 当我把Web应用打成war包,入到服务器(其实就是我的电脑本机,脱离eclipse)运行时,两次trace,第一次打印出来的中文正常显示,但第二次却是乱码。

所以我觉得很诡异,同样的一段代码,在不同的方式运行出不同的结果。不知道是不是JTidy会依赖什么环境变量?

我用的是:eclipse Helios Service Release 1, tomcat 7(与这个无关,我也试过6),操作系统是Win7 英文。

百思不得其解,救解!

ByteArrayInputStream in = null;
try {
in
= new ByteArrayInputStream(responseString.getBytes());
logger.trace(
"@@@@@@@ ByteArrayInputStream -> \n\n" + responseString + "\n\n");

Tidy tidy
= new Tidy();
tidy.setQuiet(
true);
tidy.setShowWarnings(
false);
tidy.setInputEncoding(
"UTF-8");

org.w3c.dom.Document dom
= tidy.parseDOM(in, null);

Document doc
= new DOMReader().read(dom);
logger.trace(
"@@@@@@@ SAXReader -> \n\n" + doc.asXML() + "\n\n");

} finally {
try {
in.close();
}
catch (IOException ignore) {
}
}

沐风徐徐的主页 沐风徐徐 | 初学一级 | 园豆:155
提问于:2011-09-08 09:16
< >
分享
最佳答案
0

我是做.net的,不知道跟你们java有没有区别,就权作为建议把;

首先要保证页面的格式是不是UTF-8,然后网站的配置文件里面responseEncoding以及requestEncoding是不是都是设置的为utf-8 ;

收获园豆:50
Devin Mao | 小虾三级 |园豆:596 | 2011-09-08 23:16

谢谢你的建议。

整个过程分为

1,通过HTTPClient请求页面,把页面内容转化为一个String (这一步已经没有问题,最后拿到的String我已经证实能正确打印出中文)

2,通过JTidy对这个String进行解析,目的是修正不正确,或者不完整的HTML标签,因为后面要将它作一个XML文件处理。(问题出在这一步)。

沐风徐徐 | 园豆:155 (初学一级) | 2011-09-09 07:28

@沐风徐徐: 不知道为什么“问题补充”那个功能好像不好用了,只好写在这里了。

没有人给出正确的解答。

但我已经找到问题所在。

只有一个人回答,所以我想得分就都归你吧。

正确解答:
问题出在“new ByteArrayInputStream(responseString.getBytes());”这行代码。
String的getBytes()方法,还有一个是带参数的,public byte[] getBytes(String charsetName)。
而不带参数的方法会使用平台默认的Charset——“Encodes this {@code String} into a sequence of bytes using the platform's default charset, storing the result into a new byte array.”——所以,在Eclipse里运行时使用的UTF-8,而打包直接放到tomact里运行时,因为我的操作系统设置的是中文,所以默认的Charset是GBK了。
解决办法也就很简单了,改“responseString.getBytes()”为“responseString.getBytes(“UTF-8”)”就OK了。

谢谢大家的关注。
谢谢楼下朋友的回复。

沐风徐徐 | 园豆:155 (初学一级) | 2011-09-12 16:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册