欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

java网络流传输,中文乱码问题。

发布时间:2025/7/14 编程问答 54 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java网络流传输,中文乱码问题。 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

最近需要从某个网页上抓取数据。一波三折。

1. 先要找到网站页面调用后台数据服务的url地址,但是本人对js不了解,花了不少时间在分析其网页源代码的js部分,试图寻找出调用数据的链接。

后来得知浏览器都会追踪页面发出去的所有链接,chrome中,“F12->网络” 会显示所有的调用链接。读取后端数据的链接就在里面。

2. 找到url链接之后,接下来读取数据。

 开始时用的是HttpGet类来读取,代码如下:

HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = null; try {response = httpClient.execute(httpGet);HttpEntity entity = response.getEntity();body = EntityUtils.toString(entity); } catch (IOException e) {e.printStackTrace(); }
return body

但是在body中,总是会有乱码的出现,如在页面上显示的“”在程序中显示为乱码。在页面上请求头和响应头的内容,发现返回的字符集是“gb2312”,于是把代码改为

body = EntityUtils.toString(entity,“gb2312”);

但是仍然显示为乱码。

于是在网上(http://www.qqxiuzi.cn/bianma/zifuji.php)查询“凱”等乱码的字符集,发现“GBK”包含这些,而“GB2312”并不包含这些比较少见的字。看来是网页上的字符集信息不太对。

接着把代码修改为

body = EntityUtils.toString(entity,“gbk”);

还是有问题。。。

接着尝试在http头中加入“charset=gbk”,没有变化,服务端不支持。。。

3. 改为从网页读取字节流数据

上一步改完代码后仍然有问题,猜测是EntityUtils内部已经做好了转换。但是不知道怎么更进一步,所以打算从源头开始,接收字节流数据。

代码如下:

URL quest = new URL(url); HttpURLConnection Connection = (HttpURLConnection).quest.openConnection(); InputStream is = Connection.getInputStream(); int len = 0; byte[] temp = new byte[102400]; int llen = -1; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); while ((llen = is.read(temp, 0, 102400)) != -1) {outStream.write(temp, 0, llen); } is.close(); content = new String(outStream.toByteArray(),"gbk");

ByteArrayOutputStream接收byte数据,是为了防止中间被截断导致最后翻译目标字符集的时候出现错误。

这么使用的前提是要知道数据的字符集编码。

 

从结果往回看是一个简单的方法,但是之中的每一步都花费了不少精力才找到正确的方向,debug是个苦力活~~~

综上,看来最有效的方法是接收字节流,自己转成相应字符集编码格式。

 

转载于:https://www.cnblogs.com/starRebel/p/5630872.html

总结

以上是生活随笔为你收集整理的java网络流传输,中文乱码问题。的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。