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是个苦力活~~~
综上,看来最有效的方法是接收字节流,自己转成相应字符集编码格式。
java网络流传输,中文乱码问题。的更多相关文章
- java 页面传输中文乱码解决方式
post 中文乱码解决方案 接受数据的时候设置 request.setCharacterEncoding("utf-8");//编码必须和页面编码一致 页面设置 <%@pag ...
- java socket输入输出中文乱码问题
http://hi.baidu.com/linjk03/item/e2028bfd990c14ea1a111feb 统一了输入输出的编码格式,是不会有乱码问题出现的. 构造Reader或Write ...
- java: jsp:param中文乱码
java: jsp:param中文乱码 假如a.jsp/b.jsp文件中 a.jsp代码: 需要加入:request.setCharacterEncoding("UTF-8") ...
- Java编程中中文乱码问题的研究及解决方案
0 引言 Java最大的特性是与平台的无关性及开发环境的多样性.字符串被Java应用程序转化之前,是根据操作系统默认的编码方式编码.Java语言内部采用Unicode编码,它是定长双字节编码,即任何符 ...
- ajax传输中文乱码解决方法
问题描述: 我是在一个jsp页面有一个保存按钮,点击时会触发saveForm()的js函数,在saveForm()函数里经过校验后,会通过ajax发送数据请求,这样就不用通过提交表单来传输数据了,aj ...
- java链接mysql 中文乱码
{转!} 背景: 由于最近在开发一个APP的后台程序,需要Java连接远程的MySQL数据库进行数据的更新和查询操作,并且插入的数据里有中文,在插入到数据库后发现中文都是乱码.网上查了很多教程,最后都 ...
- java开发中中文乱码总结
1.jsp页面内容显示乱码 这种乱码原因很简单,一般的工具或解码程序对中文字符解析时采用默认的解码方式: <%@ page contentType="text/html; charse ...
- Java实现过滤中文乱码
最近在日志数据清洗时遇到中文乱码,如果只要有非中文字符就将该字符串过滤掉,这种方法虽简单但并不可取,因为比如像Xperia™主題.天天四川麻将Ⅱ这样的字符串也会被过滤掉. 1. Unicode编码 U ...
- 201671010127 2016—2017—2 Java怎样解决Java程序中中文乱码的问题。
这是本次第二次分享新手在编程中遇到的问题,相信很多Java新手和我一样,在Java编程中会遇到中文乱码的情况,下面我就给大家分享我遇到问题和解决问题的具体过程. 我先用Notepad++写了一个如下的 ...
- 解决Ubuntu下的Eclipse打开Windows编写的java代码的中文乱码
其实所有的中文乱码 问题都是编码不同所导致的.这里要想让eclipse能正常显示出汉字,就要修改它的字符编码 步骤如下: 1 ,点击菜单栏中的Window(窗口),选择Preferences(首选项) ...
随机推荐
- AI(一):概念与资讯
AI: Artificial Intelligence(人工智能),它是研究.开发用于模拟和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学,上个世纪50年代一次学术讨论会议上,下图中几位著 ...
- ecmobile中IOS版本中界面文字不显示的解决
查找以下方法. - (BOOL)setCurrentLanguageName:(NSString *)name{ BeeLanguage * lang = [self findLangu ...
- Python字符串处理
字符串输入: my_string = raw_input("please input a word:") 字符串判断: (1) 判断是不是纯字母 my_string.isalpha ...
- [系统开发] Python 实现的 Bind 智能 DNS Web 管理系统
在公司的运营中,DNS还是很重要的,不仅名称解析需要DNS,一些重要的服务,比如负载均衡.HTTP 虚拟主机也会用到它.Bind 手工管理方式有一定的危险性,一旦写错格式就会造成 DNS 服务瘫痪. ...
- jquery.cookie() 的使用(原)
jquery.cookie()是一个轻量级的cookie 插件,可以读取.写入.删除 cookie. 步奏: 1. 添加jQuery插件和jQuery.cookie插件 <script src= ...
- ASCIITable: 演示 Arduino 串口输出的进阶功能
原文地址 - https://www.arduino.cc/en/Tutorial/ASCIITable ASCII字符表 本例展示了高级的串口打印功能,通过本功能可以在Arduino软件(IDE)的 ...
- the import javax.servlet
问题: 在eclipse中编写servlet时出现“the import javax.servlet unresolved” 问题原因: 缺少servlet-api.jar架包. 问题解决办法: 在e ...
- Model View Controller
On the iPhone or iPod touch, a modal view controller takes over the entire screen. This is the defau ...
- 安装SQl 2008为SQL Server代理服务提供的凭据无效
解决:安装SQl 2008为SQL Server代理服务提供的凭据无效 sql server 2008 代理服务提供的凭据无效sql server 2008 代理服务提供的凭据无效在Windows S ...
- ionic tabs置顶
找了好久怎么解决这问题,终于找到了一哥们留下来的经验,万分感谢,特此拷贝过来,留着下次以免忘记 我在主页ion-nav-bar元素上添加hide-nav-bar=“true”;然后又在ion-view ...