php网页抓取乱码(wktmltopdf工具是使用Webkit引擎来将HTML网页转换为PDF文件)
优采云 发布时间: 2021-10-10 08:22php网页抓取乱码(wktmltopdf工具是使用Webkit引擎来将HTML网页转换为PDF文件)
wktmltopdf 工具使用 Webkit 引擎将 HTML 网页转换为 PDF 文件。wkhtmltopdf工具的相关信息请参考:
/p/wkhtmltop...
…
在使用过程中,部分网页出现中文乱码,部分网页中文显示正常。在通过搜索引擎搜索答案的时候,发现有的人遇到中午一片空白,没有显示。
在开源项目的问答中,有一些作者的回复:
/p/wkhtmltop...
/p/wkhtmltop...
这些问题主要是Linux环境下没有安装中文字体造成的,我遇到的问题是可以显示中文,但是乱码,所以针对这个问题做了几个测试:
1.中文字体问题
2.网页编码
3.文件编码
测试一:(百度首页的charset=utf-8)
图片
[图片上传失败...(image-3a4c23-74)]
可以看出中文是正常的。
测试二(51cto博客网页的charset=gb2312):
图片
图片
可以看出网页内容的编码格式为:gb2312无法显示中文。
测试三:
检查网页中使用的字体:
图片
通过与本地电脑的字体对比,排除了这种可能性。其实转换后的PDF文件是可以显示中文的,虽然是乱码,但是字体问题也可以排除。
测试四:
考虑到wkhtmltopdf使用的是webkit引擎,第二次测试遇到了网页内容编码格式:gb2312,导致中文无法显示,所以使用程序抓取网页进行转换。
@Test
public void test2() throws IOException {
URL url = new URL("http://aiilive.blog.51cto.com/1925756/1332579");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedInputStream bi = new BufferedInputStream(
conn.getInputStream());
BufferedOutputStream bo = new BufferedOutputStream(
new FileOutputStream(new File("D:\\1332579.html")));
byte[] bts = new byte[1024];
int len = bi.read(bts);
while (len != -1) {
bo.write(bts, 0, len);
len = bi.read(bts);
}
bi.close();
bo.close();
System.out.println("create ok");
}
}
通过本地转换,使页面内容:charset=utf-8,然后再转换,这是因为由于使用了webkit引擎,charset=utf-8是给浏览器的,所以使用。
图像.png
上面的测试还是失败了。!!!
官方指南中说明可以指定编码格式:--encoding encoding format; 经过测试,它不起作用。网上很多人都遇到过这个问题,也有很多人没有遇到过,但是网页正常传输成功。大多数情况下,编码中使用 UTF-8 只是巧合。
测试五:
处理获取的网页文件:
1.文件编码utf-8;字符集=utf-8;结果:中文正常
2.文件编码utf-8;字符集=gb2312;结果:中文正常
3.文件编码ansi;字符集=gb2312;结果:中文乱码
图片
实验做了这个,我们可以看出问题,wkhtmltopdf在转换html文件的时候,html文件的来源可能是一个url,也可能是一个本地的文本文件。从测试一看,百度主页显示中文正常,测试二是51cto博客中文不能正常显示,从测试五可以看出,wkhtmltopdf工作时,--encoding参数实际上是指文件存储。
因此,当无法确定服务器通过URL请求的网页编码文件格式时,会以文件内容编码格式输出,因此得出通过URL请求charset=utf8和charset=gb2312的结论。前者可以用中文显示,后者不能。
PS:Jsp页面编码说明:
1.pageEncoding="UTF-8"是指保存JSP页面时使用的编码方式,即JSP文件保存在硬盘上时使用的编码方式。2.charset="UTF-8" 指的是用于JSP页面输入输出的编码方式。当找不到 pageEncoding 时,许多服务器使用字符集而不是 pageEncoding。
我自己测试的时候网站没有遇到wkhtmltopdf中文乱码的问题。我们的JSP页面格式和内容输出编码格式是统一的,都是UTF-8。