php网页抓取乱码(wktmltopdf工具是使用Webkit引擎来将HTML网页转换为PDF文件)

优采云 发布时间: 2021-10-10 08:22

  php网页抓取乱码(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。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线